【问题标题】:Multi-dimensional array in to single array多维数组到单个数组
【发布时间】:2016-05-26 12:47:48
【问题描述】:

有没有PHP数组函数可以压缩下面的数组结构;

array:2 [▼
  0 => array:2 [▼
    0 => {#90 ▶}
    1 => {#91 ▶}
  ]
  1 => array:5 [▼
    0 => {#92 ▶}
    1 => {#93 ▶}
    2 => {#94 ▶}
    3 => {#95 ▶}
    4 => {#96 ▶}
  ]
]

像这样;

array:7 [▼
    0 => {#90 ▶}
    1 => {#91 ▶}
    3 => {#92 ▶}
    4 => {#93 ▶}
    5 => {#94 ▶}
    6 => {#95 ▶}
    7 => {#96 ▶}
  ]
]

抱歉,这是一个使用 Laravel 的 dd(死掉并转储),但我想你已经大致了解了我想要实现的目标。

另外请注意,这可能并不总是传入数据的结构。有时它只是一个单维数组。所以这会导致错误;

$domain->questions = call_user_func_array('array_merge', $domain->questions);

【问题讨论】:

标签: php arrays


【解决方案1】:

这似乎有效,但只有在阵列深度为 2 层时才能达到目的。幸运的是,这就是我现在所需要的;

if(is_array($questions[0])) {
    $questions = call_user_func_array('array_merge', $questions);
}

【讨论】:

    【解决方案2】:

    这里是一维和二维数组的解决方案:

    <?php
    $input = array(
        array(
            0 => '#90',
            1 => '#91',
        ),
        array(
            0 => '#92',
            1 => '#93',
            2 => '#94',
            3 => '#95',
            4 => '#96',
        )
    );
    
    $newarray = array();
    foreach($input as $items) {
        if (is_array($items)) foreach ($items as $item) {
            $newarray[] = $item;
        } else {
            $newarray[] = $items;
        }
    }
    
    echo '<pre>'; print_r($newarray); echo '</pre>';
    

    这是与混合数组(数组数组和项数组)相同的 foreach 逻辑:

    <?php
    
    $input = array(
        0 => '#90',
        array(
            0 => '#91',
            1 => '#92',
        ),
        4 => '#93',
        5 => '#94',
        6 => '#95',
        7 => '#96',
    );
    
    $newarray = array();
    foreach($input as $items) {
        if (is_array($items)) foreach ($items as $item) {
            $newarray[] = $item;
        } else {
            $newarray[] = $items;
        }
    }
    echo '<pre>'; print_r($newarray); echo '</pre>';
    

    因此,无论输入数组是一维、二维还是混合数组,foreach 逻辑都是可用的。

    在这两种情况下,结果都是:

    数组
    (
    [0] => #90
    [1] => #91
    [2] => #92
    [3] => #93
    [4] => #94
    [5] => #95
    [6] => #96
    )

    【讨论】:

      【解决方案3】:

      因为你不知道数组是否包含子项,你可以试试这样:

      function flatten($array) {
          // If this is already an empty array or a flat array, just return it
          if (empty($array) || ! is_array($array[0])) {
              return $array;
          }
      
          // just merge all sub-arrays into a single array
          $flat = [];
          foreach ($array as $item) {
              $flat = array_merge($flat, $item)
          }
          return $flat;
      }
      

      另一个较慢(但对不同格式更具弹性)的选项是:

      function flatten($array) {
          // If this is already an empty array just return it
          if (empty($array)) {
              return $array;
          }
      
          // just add all sub-items into a single array
          $flat = [];
          foreach ($array as $item) {
              if (is_array($item)) {
                 $flat = array_merge($flat, flatten($item));
              } else {
                 $flat[] = $item;
              }
          }
          return $flat;
      }
      

      这将对数组进行“深度”展平,但正如我所说 - 会更慢

      【讨论】:

        【解决方案4】:

        试试这个简单的功能:

        function flatArray( $array )
        {
            $retval = array();
        
            foreach( $array as $val )
            {
                if( is_array( $val ) ) $retval  = array_merge( $retval, flatArray( $val ) );
                else                   $retval[] = $val;
            }
            return $retval;
        }
        

        然后:

        $array1 = [['#90','#91'],['#92','#93','#94','#95','#96']];
        $array2 = ['#82','#83','#84','#85','#86'];
        $array3 = [['#90','#91',['100','101']],['#92','#93','#94','#95','#96']];
        print_r( flatArray( $array1 ) );
        print_r( flatArray( $array2 ) );
        print_r( flatArray( $array3 ) );
        

        将输出:

        Array
        (
            [0] => #90
            [1] => #91
            [2] => #92
            [3] => #93
            [4] => #94
            [5] => #95
            [6] => #96
        )
        

        Array
        (
            [0] => #82
            [1] => #83
            [2] => #84
            [3] => #85
            [4] => #86
        )
        

        和-对于array3(三个级别):

        Array
        (
            [0] => #90
            [1] => #91
            [2] => 100
            [3] => 101
            [4] => #92
            [5] => #93
            [6] => #94
            [7] => #95
            [8] => #96
        )
        

        eval.in demo

        编辑:

        添加递归调用:通过这种方式,您甚至可以展平多嵌套数组

        【讨论】:

          【解决方案5】:

          我认为这是你想要的

          <?php
          
          $tester = [
              ['90', '91'],
              ['92', '93', '94', '95', '96']
          ];
          
          $tester2 = array_merge($tester[0], $tester[1]);
          
          print_r($tester);
          print_r($tester2);
          

          产生这个输出:

          Array
          (
              [0] => Array
                  (
                      [0] => 90
                      [1] => 91
                  )
          
              [1] => Array
                  (
                      [0] => 92
                      [1] => 93
                      [2] => 94
                      [3] => 95
                      [4] => 96
                  )
          
          )
          Array
          (
              [0] => 90
              [1] => 91
              [2] => 92
              [3] => 93
              [4] => 94
              [5] => 95
              [6] => 96
          )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-07-13
            • 2019-03-17
            • 1970-01-01
            • 2016-12-11
            • 2015-12-24
            • 1970-01-01
            • 2021-10-21
            • 2022-01-06
            相关资源
            最近更新 更多