【问题标题】:how to flatten a multidimensional array in php [duplicate]如何在php中展平多维数组[重复]
【发布时间】:2025-12-06 06:25:05
【问题描述】:

这是我的数组,我希望在一个数组中包含 60、20、39、70、12、29、31、72、59。一维数组。

$marks = array(
    "abc" => array(
    "a" => 60,
    "b" => 20,
    "c" => 39
    ),
    "def" => array(
    "a" => 70,
    "b" => 12,
    "c" => 29
    ),
    "xyz" => array(
    "a" => 31,
    "b" => 72,
    "c" => 59
    )
 );

我的尝试是

foreach($marks as $name=>$score)
{
   foreach($score as $subject=>$number)
     { 
$array[]= $number;
    } 

}

但是当我打印这个数组时,它会再次生成三个数组。 在 print_r($array);它显示了这个输出。

Array ( [0] => 60 [1] => 20 [2] => 39 ) Array ( [0] => 60 [1] => 20 [2] => 39 [3] => 70 [4] => 12 [5] => 29 ) Array ( [0] => 60 [1] => 20 [2] => 39 [3] => 70 [4] => 12 [5] => 29 [6] => 31 [7] => 72 [8] => 59 )

是否有任何方法可以从上述数组中仅获取最后一个数组。或任何其他解决方案。

【问题讨论】:

  • 打印出来的结果是什么!!
  • 您的代码正在运行,它会产生预期的输出,但在 foreach 之后缺少“}”。

标签: php arrays multidimensional-array


【解决方案1】:

试试这个来展平数组:

<?php

$marks = array(
    "abc" => array(
    "a" => 60,
    "b" => 20,
    "c" => 39
    ),
    "def" => array(
    "a" => 70,
    "b" => 12,
    "c" => 29
    ),
    "xyz" => array(
    "a" => 31,
    "b" => 72,
    "c" => 59
    )
 );

function array_values_recursive($array)
{
    $arrayValues = array();

    foreach ($array as $value)
    {
        if (is_scalar($value) OR is_resource($value))
        {
             $arrayValues[] = $value;
        }
        elseif (is_array($value))
        {
             $arrayValues = array_merge($arrayValues, array_values_recursive($value));
        }
    }

    return $arrayValues;
}

 var_dump(array_values_recursive($marks));

输出:

array(9) { [0]=> int(60) [1]=> int(20) [2]=> int(39) [3]=> int(70) [4]=> int(12) [5]=> int(29) [6]=> int(31) [7]=> int(72) [8]=> int(59) }

此自定义函数取自:http://php.net/manual/en/function.array-values.php

【讨论】:

    【解决方案2】:

    您可以使用任何一种传统方式,即 foreach 循环,也可以使用迭代器。看看下面的解决方案:

    1) 使用foreach 循环和array_merge 函数

    $marks = array(
        "abc" => array(
            "a" => 60,
            "b" => 20,
            "c" => 39
        ),
        "def" => array(
            "a" => 70,
            "b" => 12,
            "c" => 29
        ),
        "xyz" => array(
            "a" => 31,
            "b" => 72,
            "c" => 59
        )
    );
    
    $new_array = array();
    foreach ($marks as $mark) {
        $new_array = array_merge($new_array, array_values($mark));
    }
    
    print_r($new_array);
    

    2) 使用ArrayIterator:

    $new_array = array();
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($marks));
    foreach ($iterator as $key => $value) {
        $new_array[] = $value;
    }
    
    print_r($new_array);
    

    在这两种解决方案中输出将是:

    Array
    (
        [0] => 60
        [1] => 20
        [2] => 39
        [3] => 70
        [4] => 12
        [5] => 29
        [6] => 31
        [7] => 72
        [8] => 59
    )
    

    【讨论】:

      【解决方案3】:

      因为您在第一个 foreach 循环中倾倒了 $array :)

      【讨论】:

        【解决方案4】:

        你的声音像你可能会在 for 循环中声明你的 $array,如果你这样做你会得到三个数组。所以在 for 循环之外声明将得到单个数组

        $array = array(); //correct
        foreach($marks as $name=>$score)
        {
        //$array = array(); //incorrect
         foreach($score as $subject=>$number)
         { 
           $array[]= $number;
         }
        }
        var_dump($array);
        

        【讨论】:

          【解决方案5】:
          foreach($marks as $name=>$score)
          {
              foreach($score as $subject=>$number)
              { 
                  $array[]= $number;
              }
          }
          

          【讨论】: