[英]How can I efficiently split an array into its associative key arrays?
如何将单个数组拆分为子键?
$arr = array(
0 => array(
'foo' => '1',
'bar' => 'A'
),
1 => array(
'foo' => '2',
'bar' => 'B'
),
2 => array(
'foo' => '3',
'bar' => 'C'
)
);
分别返回foo和bar数组的最有效方法是什么?
我需要到达这里:
$foo = array('1','2','3');
$bar = array('A','B','C');
我希望有一个聪明的方法可以使用array_map
或类似的方法来做到这一点。 有任何想法吗?
还是我必须遍历并以这种方式构建每个阵列? 就像是:
foreach ($arr as $v) {
$foo[] = $v['foo'];
$bar[] = $v['bar'];
}
碰巧的是,我今天早些时候需要做几乎完全相同的事情。 您可以将array_map()
与array_shift()
结合使用:
$foo = array_map('array_shift', &$arr);
$bar = array_map('array_shift', &$arr);
请注意, $arr
是通过引用传递的! 如果您不这样做,那么每次它将返回$arr[<index>]['foo']
。 但是,再次由于引用-您将无法重用$arr
,因此,如果需要这样做-请首先复制它。
缺点是您需要按照与示例中相同的方式对数组键进行排序,因为array_shift()
实际上并不知道键是什么。 它不适用于以下数组:
$arr = array(
0 => array(
'foo' => '1',
'bar' => 'A'
),
1 => array(
'bar' => 'B',
'foo' => '2'
),
2 => array(
'foo' => '3',
'bar' => 'C'
)
);
更新:
阅读注释后,很明显,我的解决方案触发了E_DEPRECATED
警告,以引用时传递呼叫。 这是@Baba提出的建议(并接受作为答案),它利用了两个必需的键,它们是第二维数组的第一个和最后一个元素:
$foo = array_map('array_shift', $arr);
$bar = array_map('array_pop', $arr);
$n = array();
foreach($arr as $key=>$val) {
foreach($val as $k=>$v) {
$n[$k][] = $v;
}
}
array_merge_recursive
将把具有相同键的标量值组合到一个数组中。 例如:
array_merge_recursive(array('a',1), array('b',2)) === array(array('a','b'),array(1,2));
您可以使用此属性简单地将array_merge_recursive
作为单独的参数应用于数组中的每个数组:
call_user_func_array('array_merge_recursive', $arr);
您将得到以下结果:
array (
'foo' =>
array (
0 => '1',
1 => '2',
2 => '3',
),
'bar' =>
array (
0 => 'A',
1 => 'B',
2 => 'C',
),
)
甚至不会因键顺序不同而混淆。
但是,每个合并的值都必须是标量! 数组将被合并,而不是作为子数组添加:
array_merge_recursive(array(1), array(array(2)) === array(array(1,2))
它不产生array(array(1, array(2)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.