Как вам нужно запустить ту же функцию на каждом элементе $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)
}
}
Это отсутствует случай края, что '$ sub' не является массивом (если вы хотите, чтобы предотвратить предупреждения, полный). Кроме того, я предлагаю вам поместить массив с значениями NULL вместо 0. Я использовал анонимную функцию обратного вызова, чтобы сделать ключи частью обратного вызова. Это позволяет использовать его для любого значения. См. [Мой ответ] (http://stackoverflow.com/a/8660676/367456). – hakre
@hakre Я предположил, что подразумевалось, что '$ sub' всегда будет массивом, но это можно легко разместить, если это не так (хотя мне нравятся ваши обратные вызовы). –