Поскольку вам необходимо запустить одну и ту же функцию для каждого элемента массива $b
:
$a = array(4=>2000,5=>5000,7=>1000,3=>5000);
$b = array(array(0,4,10,1000), array(0,4,10,40));
Вы можете использовать array_map
с функцией обратного вызова. Затем функция обратного вызова использует array_combine
для присвоения вашим ключам значений.
Поскольку array_combine
должны иметь ключи для работы, но обратный вызов имеет только входные значения, я создал функцию, которая создает фактическую функцию обратного вызова на основе массива, ключи которого будут взяты для операции array_combine
.
Поскольку массивы могут содержать любые значения, предпринимаются некоторые меры предосторожности. Пустые массивы не будут обрабатываться вообще, пропущенные значения для определенных ключей будут сигнализироваться как NULL
:
$keyed = function($array)
{
$keys = array_keys($array);
// no keys, nothing to combine
if (!$len = count($keys)) {
return function($v) {return array();};
}
// default values are all NULL
$pad = array_fill(0, $len, NULL);
return function($values) use ($keys, $pad, $len)
{
// if input is not array, make it an empty array
!is_array($values) && $values = array();
return array_combine($keys, array_slice($values + $pad, 0, $len));
};
};
$keyed
теперь является анонимной функцией, которая будет возвращать функцию обратного вызова для array_map
в зависимости от входного параметра для ключей массива:
$c = array_map($keyed($a), $b);
Анонимные функции доступны в PHP начиная с версии 5.3.
Выход:
array(2) {
[0]=> array(4) {
[4]=> int(0)
[5]=> int(4)
[7]=> int(10)
[3]=> int(1000)
}
[1]=> array(4) {
[4]=> int(0)
[5]=> int(4)
[7]=> int(10)
[3]=> int(40)
}
}