如何展平和排序包含数字和数字子阵列的多维数组?

时间:2017-08-22 20:36:22

标签: php sorting recursion multidimensional-array numeric

我需要帮助排序由数字字符串和数字字符串数组组成的多维数组。

这是我的代码:

$array =  array();
$multi= array(
              10,
              9,
              array(5,4),
              array(6,7),
              array(3,2),
              array(8,1)
        );

foreach ($multi as $value) {
    if (is_numeric($value)) {
        array_push($array, $value);
    }
    if (is_array($value)) {
        array_push($array, $value);
    }
}
sort($array);
for ($i=0; $i <count($array) ; $i++) { 
    echo $array[$i];
}

2 个答案:

答案 0 :(得分:1)

这是一种 MUCH 更干净的方式,没有条件,也没有嵌套的foreach循环。 array_walk_recursive()只会对&#34; leaf-nodes&#34;进行交互。所以你不需要检查某些东西是否是一个数组并运行一个内部的foreach循环。

代码:(Demo

$multi=[10,9,[5,4],[6,7],[3,2],[8,1]];
array_walk_recursive($multi,function($v)use(&$flat){$flat[]=$v;});
sort($flat);
var_export($flat);

输出:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 4,
  4 => 5,
  5 => 6,
  6 => 7,
  7 => 8,
  8 => 9,
  9 => 10,
)

根据your earlier closed question判断,您需要使用以下完整方法:

代码:(Demo

$multi=[10,9,[5,4],[6,7],[3,2],[8,1]];                               // declare multi-dim array
array_walk_recursive($multi,function($v)use(&$flat){$flat[]=$v;});   // store values
sort($flat);                                                         // sort

echo '<center>',implode('</center><br><center>',$flat),'</center>';  // display

// this will generate a trailing <br> tag that you may not wish to have:
/*
foreach($flat as $v){
    echo "<center>$v</center><br>";
}
*/

未呈现的HTML输出:

<center>1</center><br>
<center>2</center><br>
<center>3</center><br>
<center>4</center><br>
<center>5</center><br>
<center>6</center><br>
<center>7</center><br>
<center>8</center><br>
<center>9</center><br>
<center>10</center>

答案 1 :(得分:0)

我希望你这样想: -

foreach ($multi as $value) {
    if (is_numeric($value)) {
        $array[] =  $value;
    }if (is_array($value)) {
        foreach($value as $val){
            $array[] =  $val;
        }
    }
}
sort($array);
print_r($array);

输出: - https://eval.in/848749