"Array_combine" с ассоциативными массивами - PullRequest
2 голосов
/ 28 декабря 2011

Мне нужно объединить ключи из массива со значениями в другом массиве:

$a = array(4=>2000,5=>5000,7=>1000,3=>5000);
$b = arrray(array(0=>0,1=>4,2=>10,3=>1000),array()...)

Вот что я написал (не работает):

$keys = array_keys($a);
foreach ($b as $k => $v) {
array_combine($keys,$v);
}

Я ожидаю получить:

$c = array(array(4=>0,5=>4,7=>10,3=>1000),array(4=>...));

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

Ваш код почти на месте:

$final=array();
$keys = array_keys($a);
foreach ($b as $v) {
  $final[]=array_combine($keys,$v);
}
2 голосов
/ 29 декабря 2011

Поскольку вам необходимо запустить одну и ту же функцию для каждого элемента массива $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)
  }
}
1 голос
/ 28 декабря 2011

Поскольку b содержит несколько массивов, вам просто нужно выполнить простую итерацию b:

$a = array(4=>2000,5=>5000,7=>1000,3=>5000);
$b = array(array(0=>0,1=>4,2=>10,3=>1000), array(0=>0,1=>4,2=>10,3=>1000));

$keys = array_keys($a);
$length = count($keys);
$c = array();
foreach($b as $sub) {
    if(!is_array($sub)) {
        $sub = array();
    }

    $c[] = array_combine(array_pad($keys, count($sub), NULL), array_pad(array_values($sub), $length, NULL)); // Pad removes the possibility of a warning
}

print_r($c);

У вас была правильная идея с array_keys($a) и array_combine().Другим аргументом, который вам нужен, чтобы перейти к array_combine(), являются значения array_values($b).Но так как в b есть несколько массивов, вам нужно перебрать каждый из них.В качестве отказоустойчивого случая, когда в a или любом из подмассивов b имеется больше или меньше пар ключ / значение, я добавил array_pad(), чтобы убедиться, что два массива, переданные в array_combine(), имеют одинаковую длину, поэтомучто PHP не жалуется.

...