我需要将数组中的键与另一个数组中的值组合起来:
$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=>...));
答案 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不会抱怨。