1

如何将单个数组拆分为它的子键?

$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'];
}
4

3 回答 3

1

幸运的是,我今天早些时候需要做几乎完全相同的事情。您可以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了 call-time-pass-by-reference 的警告。这是@Baba 建议的(并被接受为答案)替代方案,它利用了两个所需的键作为第二维数组的第一个和最后一个元素:

$foo = array_map('array_shift', $arr);
$bar = array_map('array_pop', $arr);
于 2012-11-30T00:45:27.850 回答
0
$n = array();

foreach($arr as $key=>$val) {
    foreach($val as $k=>$v) {
        $n[$k][] = $v;
    }
}
于 2012-11-29T22:40:54.803 回答
0

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)))

于 2013-02-19T03:32:00.557 回答