【问题标题】:php Remove parent level array from set of arrays and merge nodesphp 从数组集中删除父级数组并合并节点
【发布时间】:2012-12-04 22:22:49
【问题描述】:

我不擅长操作数组...鉴于这种结构,我想删除顶级数组并将所有子集合并到一个平面数组中:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => hey.com
                )

            [1] => Array
                (
                    [0] => you.com
                )
        )
    [1] => Array
        (
            [0] => Array
                (
                    [0] => this.com
                )

            [1] => Array
                (
                    [0] => rocks.com
                )
        )
)

到所需的结构:

Array
    (
        [0] => hey.com
        [1] => you.com
        [2] => this.com
        [3] => rocks.com
    )

速度至关重要 - 我们将处理数十万个结果

【问题讨论】:

  • 你真的希望结果是array(array('hey.com', 'you.com', 'this.com', 'rocks.com')) 吗?
  • 我只需要一个包含所有实际值的平面数组,仅此而已。
  • 查看我刚刚所做的编辑
  • 对。如果数组中只有那个固定(单个)项,只需使用一些嵌套的foreach() 循环。否则就去like this
  • RecursiveArrayIterator 很漂亮...+1 非常感谢!

标签: php arrays multidimensional-array


【解决方案1】:
$flat = call_user_func_array('array_merge', $arr);

这会将数组展平恰好一层。它将采用您提供的示例输入,并产生您要求的所需输出。

*注意 - 在发布此答案后,对问题进行了编辑。该问题先前要求以下预期结果:

Array
(
    [0] => Array
        (
            [0] => hey.com
            [1] => you.com
            [2] => this.com
            [3] => rocks.com
        )

)

上面的array_merge() 答案提供了什么。

确保:

  1. 您的父数组使用数字索引
  2. 父数组至少有一个子元素,否则你会因为array_merge抱怨没有参数而得到一个php错误。

对于那些想知道它是如何工作的人:

// with 
$arr = [ [1,2,3], [4,5,6] ];
// call_user_func_array('array_merge', $arr) is like calling
array_merge($arr[0], $arr[1]);

// and with 
$arr = [ [1,2,3], [4,5,6], [7,8,9] ];
// then it's like:
array_merge($arr[0], $arr[1], $arr[2]);
// and so on...

如果您使用的是 php 5.6+,则 splat 运算符 (...) 可以更易读:

$flat = array_merge(...$arr);

如果您想要扁平化多个级别,您可以使用多个嵌套的array_merge() 调用,或者如果您想要递归地完全扁平化结构:

// This is a great option if you don't know what depth the structure may be,
// or if the structure may contain different arrays with different depths.
$flat = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)));

【讨论】:

    【解决方案2】:

    如果值始终处于相同的深度级别,您确实可以使用 array_merge:

    $array = [                                                                                                                                                                                                                                 
        [
            ['hey.com'],
            ['you.com'],
        ],                                                                                                                                                                                                                
        [
            ['this.com'],
            ['rocks.com'],
        ],                                                                                                                                                                                                             
    ];
    
    print_r(array_merge(... array_merge(... $array)));
    
    Getting:
    
    Array
    (
        [0] => hey.com
        [1] => you.com
        [2] => this.com
        [3] => rocks.com
    )
    

    【讨论】:

      【解决方案3】:

      如果数组只有一级关联索引,并且只有一个元素:

      foreach($arr as $key=>$val) { 
         if (is_array($arr[$key])) $arr[$key] = $arr[$key][0]; 
      }
      
      Getting:
      
      [file] => Array (
                  [name] => black.png
                  [type] => image/png
                  [tmp_name] => /tmp/phpfupdU5
                  [error] => 0
                  [size] => 197782
              )    
      
      from:    
      
      [file] => Array (
                  [name] => Array
                      ( [0] => black.png )
                  [type] => Array
                      ( [0] => image/png )
                  [tmp_name] => Array
                      ( [0] => /tmp/phpfupdU5 )
                  [error] => Array
                      ( [0] => 0 )
                  [size] => Array
                      ( [0] => 197782 )
              )
      

      【讨论】:

        【解决方案4】:
        <?php
        //Very simple recoursive solution
        $array = array(
            array(
                array('hey.com'),
                array('you.com')
            ),
            array(
                array('this.com'),
                array('rocks.com'),
                array(
                    array('its.com'),
                    array(
                        array('soo.com'),
                        array('deep.com')
                    )
                )
            )
        );
        
        function deepValues(array $array) {
            $values = array();
            foreach($array as $level) {
                if (is_array($level)) {
                    $values = array_merge($values,deepValues($level));
                } else {
                    $values[] = $level;
                }
            }
            return $values;
        }
        
        $values = deepValues($array);
        echo "<pre>";
        print_r($values);
        echo "</pre>";
        ?>
        

        我不知道如何得到这样的 arral,但这个解决方案是只获取值。

        [编辑] 对不起,这是最甜蜜的:

        function deepValues(array $array, array &$values) {
            foreach($array as $level) {
                if (is_array($level)) {
                    deepValues($level, $values);
                } else {
                    $values[] = $level;
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          如果您的数组始终具有相同的先前已知深度,也许您可​​以充分利用

          http://php.net/manual/es/function.array-merge.php

          【讨论】:

            【解决方案6】:

            你可以使用RecursiveArrayIterator

            $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));
            $list = iterator_to_array($it,false);
            var_dump($list);
            

            输出

            array (size=4)
              0 => string 'hey.com' (length=7)
              1 => string 'you.com' (length=7)
              2 => string 'this.com' (length=8)
              3 => string 'rocks.com' (length=9)
            

            See Simple Demo

            【讨论】:

            • 在这种情况下不需要循环,请参阅my comment, above
            • 善用iterator_to_array+
            • 我对 OP 的建议是忘记使用 iterator_to_array() 并循环遍历迭代器。
            • 迄今为止最好的解决方案,感谢它对我非常有用:)
            • 解决了我的问题。谢谢一百万
            猜你喜欢
            • 1970-01-01
            • 2021-06-19
            • 1970-01-01
            • 2011-09-05
            • 2019-07-02
            • 1970-01-01
            • 2017-04-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多