试图从多维(递归)数组中提取所有值

时间:2009-12-28 20:15:17

标签: php arrays

我正在尝试创建一个包含现有多维数组的所有值的单个数组。这就是我到目前为止所做的:

function MaxArray($arr) {

    foreach ($arr as $value) {

        if (is_array($value)) {
            MaxArray($value);
        } else {
            $array[] = $value;
        }
    }
    print_r($array);

}

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404, array(1,2))));

MaxArray($arr);

当我执行此代码时,我从print_r函数获得此响应...

Array ( [0] => 141 [1] => 151 [2] => 161 ) Array ( [0] => 1 [1] => 2 ) Array ( [0] => 303 [1] => 404 ) Array ( [0] => 101 [1] => 202 ) Array ( [0] => 2 [1] => 3 ) 

正如您所看到的,这不是我想要的,我无法弄清楚如何将多维数组中的所有值组合成一个数组。有人可以指点我在正确的方向吗?

5 个答案:

答案 0 :(得分:5)

你要做的事情通常被称为'数字展平',因此ArrayFlatten可能是一个比MaxArray更好的函数名称(因为后者听起来像它会返回最高数组中的值,max表现得非常好。 ArrayFlatten可以这样写:

function ArrayFlatten($array, $return) {
  for ($x = 0; $x < count($array); $x++) {
    if(is_array($array[$x])) {
      $return = ArrayFlatten($array[$x], $return);
    }
    else {
      if($array[$x]) {
        $return[] = $array[$x];
      }
    }
  }

  return $return;
}

并像这样使用:

$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p')));    
$res = ArrayFlatten($myarray,array());

要得到这个:

Array
(
    [0] => a
    [1] => b
    [2] => x
    [3] => y
    [4] => z
    [5] => p
)

来自here

答案 1 :(得分:0)

每次执行MaxArray()时都会重新创建并打印$ array。您需要在所有递归执行上构建它。我认为最好的方法是让MaxArray()函数返回该数组而不是将其打印出来。 ......当我打字时,Dominic Rodger刚刚为你做了这件事!

答案 2 :(得分:0)

该函数应该引用结果数组,它永远不会改变。

function flatten($cur, & $result) { ... flatten($x, $result); ... }

以下是一个示例:http://davidwalsh.name/flatten-nested-arrays-php

答案 3 :(得分:0)

这是另一个变体,用于说明foreach的使用和保留(某些)字符串键。

function array_flatten($array) {
    $rslt = array();
    foreach ($array as $key => $val) {
        if (is_array($val)) {
            $rslt = array_merge($rslt, array_flatten($val));
        } elseif (is_int($key)) {
            $rslt[] = $val;
        } else {
            // for string keys, earlier values are overwritten with later ones
            $rslt[$key] = $val;
        }
    }
    return $rslt;
}

对于不同的碰撞行为,请更改$rslt[$key] = $val;行。

答案 4 :(得分:0)

如果您只想输出递归数组的最大值,请使用此

function MaxArray($arr) {
  $max = 0;
  foreach($arr as $a)
  {
   if(is_array($a)) {
     $max = MaxArray($a);
   } else if($a > $max){
     $max = $a;
   }
 }
 return $max;
}