首页 > 解决方案 > PHP normalize multidimensional array

问题描述

want to normalize an array and need help.

Array i have:

$myArr = array(
  array(
    array(
      array("id" => 1)
    )
  ),
  array("id" => 2),
  array("id" => 3),
  array(
    array(
     "id" => 4)
    )
);

Array i want to have:

 $myArr = array(
  array("id" => 1),
  array("id" => 2),
  array("id" => 3),
  array("id" => 4)
);

My idea to solve that prob is calling a recursive method, which is not working yet:

function myRecArrFunc(&myarr){
  $output = [];

  foreach{$myarr as $v}{
      if(!isset{$v["id"]){
       $output[] = myRecArrFunc($v);
      } else{
        $output[] = $v;
      }
  }      

  return $output
}

Currently the output of the function is the same as the input. Someone has an idea what have to be done?

标签: php

解决方案


您可以使用RecursiveIteratorIterator

$result = [];
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($myArr)) as $k => $v) {
    $result[] = [$k => $v];
}

甚至更简单,array_walk_recursive

$result = [];
array_walk_recursive($myArr, function($v, $k) use (&$result) {
    $result[] = [$k => $v];
});

关于您的代码

您的代码至少有 5 个语法错误,但忽略这些,您需要考虑到递归调用将返回一个数组,其中可能包含许多 id/value 对。因此,您需要将该数组连接到您当前的结果。您可以使用array_merge使代码工作:

function myRecArrFunc(&$myarr){
    $output = [];

    foreach($myarr as $v){
        if(!isset($v["id"])){
            $output = array_merge($output, myRecArrFunc($v));
        } else{
            $output[] = $v;
        }
    }      
    return $output;
}

推荐阅读