首页 > 解决方案 > 展平一个多维子数组,但保留依赖数组

问题描述

我正在尝试创建从 API 获得的结果的扁平数组。结果数组如下所示:

$arrayIhave = array(
 'element name single' => array(
   '__sort_name' => 'Name for sorting',
   'id' => '1',
 ),
 'element name single2' => array(
   '__sort_name' => 'Name for sorting',
   'id' => '2',
 ),
 'element name with nested' => array(
   '__sort_name' => 'Name for sorting',
   'sub folder name' -> array(
     '__sort_name' => 'Name for sorting',
     'id' => '3',
   ),
   'another sub folder' => array(
     '__sort_name' => 'Name for sorting',
     'id' => '4',
   )
 ),
 'element name with multi nested' => array(
   '__sort_name' => 'Name for sorting',
   'sub folder name' -> array(
     '__sort_name' => 'Name for sorting',
        'sub sub folder name' -> array(
          '__sort_name' => 'Name for sorting',
          'id' => '5',
        ),
     ),
   ),
   'another sub folder' => array(
     '__sort_name' => 'Name for sorting',
     'id' => '6',
   )
 ),
);

我试图安排的最后一个数组有一个每个元素的 id,它在树中给出了依赖项。因此,顶级项目id对其所有子文件夹都有依赖关系,无论向下多少级。

树中的最后一个子文件夹仅对其子文件夹具有依赖性。依赖树不会使用 id,因为folders没有它。

结果数组:

$arrayITryToHave = array(
 'element name single' => array(),
 'element name single2' => array(),
 'element name with nested' => array(
   'sub folder name',
 ),
 'element name with multi nested' => array(
   'sub folder name',
   'sub sub folder name', // Note the dependency array is flat and has all levels flatten
   'another sub folder',
 ),
 'sub folder name' => array( // Even though a subfolder, it has dependencies too
   'sub sub folder name',
 ),
);

我尝试使用array_walk_recursiveand with foreacharray_column但这在多层次上不起作用。我也尝试过使用常规的 foreach 和&$reference数组,但是我无法将其添加sub sub folder到上面的依赖项 1 级别,以及上面的另一个级别的依赖项。

目前使用的代码:

function generateArray(&$array, $iterate){
      foreach($iterate as $key => $value){
        $id = $key;
        // Remove invalid elements
        if(isset($value['__sort_name'])) unset($value['__sort_name']);
        // If not present already, make an array
        if(!isset($array[$id])){
          $array[$id] = array();
        }
        array_push($array[$id], array_column($value, 'name', 'name'));
      }
    }

你会如何处理这个问题?

标签: phparraysalgorithmflatten

解决方案


好的,我已经设法通过这种方式解决了,如果有人有更好的方法,请告诉我:)

function generateCollapseFolder($returnArr){
      $iterator = new \RecursiveIteratorIterator(
          new \RecursiveArrayIterator($returnArr),
          \RecursiveIteratorIterator::SELF_FIRST
      );
      $filtered = array();
      $filteredLastArrayHelper = array();
      foreach ($iterator as $key => $item) {
        // Get if we are deep down
        $currentDepth = $iterator->getDepth();
        $isNested = $currentDepth > 0;
        // We only care about this field
        if($key === '__sort_name'){
          if(!isset($filtered[$item])) $filtered[$item] = array();
          // Remember last level with key to match
          $filteredLastArrayHelper[$currentDepth] = $item;
          if($isNested){
            for ($x = $currentDepth - 1; $x >= 0; $x--) {
              $insertKey = $filteredLastArrayHelper[$x];
              if($insertKey){
                array_push($filtered[$insertKey], $item);
              }
            } 
          } else {
            // Reset the array
            $filteredLastArrayHelper = array();
          }
        }
      }
      return $filtered;
}

推荐阅读