ラボ > PHP:配列関連

PHP 多次元配列を一次元配列にしたい

親子関係を表した多次元配列がある。でも欲しいのは親子関係無しの一次元配列。

作成日:2019-02-27, 更新日:2019-02-27

基本

function ary_flatten($ary=array()) {
  if ( !is_array($ary) ) {
    return false;
  }
  
  $list = array();
  foreach ( $ary as $rowAry ) {
    if ( is_array($rowAry) ) {
      $list = array_merge($list, ary_flatten($rowAry));
    }
    else {
      $list[] = $rowAry;
    }
  }
  
  return $list;
}

任意の要素名に子、孫がいるヤツを一次元配列にしたい

▼やりたいコト:親子関係を表した多次元配列を親子関係無しの一次元配列にしたい。

$ary = array(
  array(
    'id'    => '鳥グループ',
    'depth' => '1',
    'child' => array(
                 array(
                   'id'    => '鳥精',
                   'depth' => '2',
                   'child' => array(
                                array(
                                  'id'    => '鳥精:塩',
                                  'depth' => '3',
                                ),
                                array(
                                  'id'    => '鳥精:タレ',
                                  'depth' => '3',
                                ),
                              ),
                 ),
                 array(
                   'id'    => 'ナンコツ',
                   'depth' => '2',
                   'child' => array(
                                array(
                                  'id'    => 'ナンコツ:塩',
                                  'depth' => '3',
                                ),
                                array(
                                  'id'    => 'ナンコツ:タレ',
                                  'depth' => '3',
                                ),
                              ),
                 ),
               ),
  ),
  array(
    'id'    => '豚グループ',
    'depth' => '1',
  ),
  array(
    'id'    => 'シマウマ',
    'depth' => '1',
    'child' => array(
                 array(
                   'id'    => '丸ごとシマウマ',
                   'depth' => '2',
                 ),
               ),
  ),
);

↓↓↓こんな感じにしたい

array(
  array(
    'id'    => '鳥グループ',
    'depth' => '1',
  ),
  array(
    'id'    => '鳥精',
    'depth' => '2',
  ),
  array(
    'id'    => '鳥精:塩',
    'depth' => '3',
  ),
  array(
    'id'    => '鳥精:タレ',
    'depth' => '3',
  ),
  array(
    'id'    => 'ナンコツ',
    'depth' => '2',
  ),
  array(
    'id'    => 'ナンコツ:塩',
    'depth' => '3',
  ),
  array(
    'id'    => 'ナンコツ:タレ',
    'depth' => '3',
  ),
  array(
    'id'    => '豚グループ',
    'depth' => '1',
  ),
  array(
    'id'    => 'シマウマ',
    'depth' => '1',
  ),
  array(
    'id'    => '丸ごとシマウマ',
    'depth' => '2',
  ),
)

▼「child」がいるときは再帰処理

function ary_flatten($ary=array()) {
  if ( !is_array($ary) ) {
    return false;
  }
  
  $list = array();
  foreach ( $ary as $rowAry ) {
    if ( isset( $rowAry['child'] ) ) {
      $tmp = $rowAry;
      unset($tmp['child']);
      $list[] = $tmp;
      $list = array_merge($list, ary_flatten($rowAry['child']));
    }
    else {
      $list[] = $rowAry;
    }
  }
  
  return $list;
}