“Array_combine”与关联数组

时间:2011-12-28 19:18:05

标签: php associative-array

我需要将数组中的键与另一个数组中的值组合起来:

$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 个答案:

答案 0 :(得分:3)

您的代码几乎就位于:

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

答案 1 :(得分: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需要操作键,但回调只有值作为输入,我创建了一个函数,根据数组创建实际的回调函数,为{{1操作。

由于数组可以包含任何值,因此可以采取一些预防措施。根本不会处理空数组,特定键的缺失值将显示为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

自5.3版以来,PHP中提供了匿名函数。

输出:

$c = array_map($keyed($a), $b);

答案 2 :(得分:1)

由于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中有多个数组,因此需要遍历每个数组。作为故障安全,如果b的一个或任何子数组中有更多或更少的键/值对,我添加了array_pad()以确保传入array_combine()的两个数组是等长,以便PHP不会抱怨。