繁体   English   中英

如何有效地将数组拆分为关联键数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM