2011-12-28 4 views
2

мне нужно объединить ключи из массива, со значениями в другом массиве:«array_combine» с ассоциативными массивами

$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=>...)); 

ответ

1

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

$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 не " жаловаться.

+0

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

+0

@hakre Я предположил, что подразумевалось, что '$ sub' всегда будет массивом, но это можно легко разместить, если это не так (хотя мне нравятся ваши обратные вызовы). –

3

Ваш код почти пятно на:

$final=array(); 
$keys = array_keys($a); 
foreach ($b as $v) { 
    $final[]=array_combine($keys,$v); 
} 
2

Как вам нужно запустить ту же функцию на каждом элементе $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) 
    } 
} 
Смежные вопросы