【问题标题】:2d multidimensional array to 1d array in php [duplicate]php中的二维多维数组到一维数组[重复]
【发布时间】:2011-10-18 08:25:43
【问题描述】:

只是想知道是否有人在 php 中将 2 暗数组转换为 1 暗数组。我还没有在 php.ini 中找到明确的解释。任何建议将不胜感激。

【问题讨论】:

  • 一点上下文有很长的路要走。
  • 这样做有什么意义?您只是想无缘无故地展平阵列还是只是不想要子阵列?或者你有这个需求?
  • 我一直在寻找通用解释,以便其他有类似问题但上下文不同的人可以使用。然而,在这个二维数组的每个插槽中,我都有 osm 格式的二维点。一维数组用于输入我编写的函数
  • 有一些通用的方法可以遍历二维数组的值并将它们按顺序附加到新数组中。但是,在像您这样的情况下,我认为元素的顺序很重要。您是否考虑过为现有函数编写一个包装器,该函数接受二维数组并将其转换为现有函数所需的特定格式?
  • 是的,这将是一个很好的解决方案,乔治。谢谢 。但是,我需要更改许多相互依赖的函数,不幸的是,时间至关重要。

标签: php multidimensional-array


【解决方案1】:

如果您在此处从 Query 获取值,这可能会对您有所帮助,您可以使用 PHP 5.5+ 中支持的数组函数

$myfield_arr = array_column($query_result, 'myfield_name');

说再见循环!享受智能代码。

【讨论】:

    【解决方案2】:

    试试这个:

    function array_2d_to_1d ($input_array) {
        $output_array = array();
    
        for ($i = 0; $i < count($input_array); $i++) {
          for ($j = 0; $j < count($input_array[$i]); $j++) {
            $output_array[] = $input_array[$i][$j];
          }
        }
    
        return $output_array;
    }
    

    【讨论】:

    • $output_array[] = $input_array[$i][$j]; $output_array 没有索引值
    • 在不提供索引的情况下为数组赋值意味着该值将附加到数组的末尾。
    • 对不起@Doug 我不知道,所以谢谢。我已经写了完全相同的内容,但我认为它不会填充数组,而只是继续填充到某个数字并在 for 循环的每次迭代中覆盖插槽。再次感谢您。
    • @Doug,您不需要在for 语句的末尾添加$i++$j++ 吗?
    【解决方案3】:

    你的意思是这样的?

    $array = array(array('green', 'yellow', 'orange'), array('blue', 'black', 'white'));
    $newarray = array();
    foreach (array_values($array) as $value){
       $newarray[] = $value; 
    }
    

    【讨论】:

    • $array 是一个非常混乱的变量名 :p
    • 这没有任何作用。所有这一切都是将值从$array 复制到$newarray。它不会展平数组。
    【解决方案4】:

    这取决于您需要什么,但如果您想将 2d 数组减少为完全填充 2d 平面的 1d 曲线,您可能需要寻找空间索引或空间填充曲线。有一些著名的但不为人知的曲线,如 z 曲线、希尔伯特曲线、皮亚诺曲线或摩尔曲线。你可以用 L 系统写出这样的曲线。

    【讨论】:

      【解决方案5】:

      试试这个:

      function array_to1d($a) {
          $out = array();
          foreach ($a as $b) {
              foreach ($b as $c) {
                  if (isset($c)) {
                      $out[] = $c;
                  }
              }
          }
          return $out;
      }
      

      请注意,它包含一个测试以查看该值是否已设置(非空)。具有不同长度行的数组的transposition 数组将在某些单元格中具有空值,如果您尝试线性化这样的野兽,此检查会很有帮助。

      【讨论】:

        【解决方案6】:

        你的第一个想法应该是array_reduce(),只要你有很多 something 在数组中,而你只想要一个 something 本身以某种方式代表它们。

        来自 PHP 文档:

        array_reduce — 使用回调函数迭代地将数组缩减为单个值

        在二维=>一维数组转换的情况下,somethingarray;我们在一个数组中有很多,但我们只想要其中一个。

        function array2dTo1d($array2d)
        {
            return array_reduce($array2d, function($carry, $array) {
                return array_merge($carry, $array);
            }, []);
        }
        
        var_dump(array2dTo1d(
            [
                [23423, 5454, 567],
                [4565, 687],
            ]
        ));
        
        

        结果:

        array(5) {
          [0] =>
          int(23423)
          [1] =>
          int(5454)
          [2] =>
          int(567)
          [3] =>
          int(4565)
          [4] =>
          int(687)
        }
        

        【讨论】:

          【解决方案7】:

          矩形二维数组的解决方案确实很简单,但我遇到了一个问题。我的二维数组由不同长度的一维数组组成:

          $myArray = [
              [1, 2, 3, 4],
              [5, 6, 7],
              [8, 9]
          ];
          

          我想出了更通用的解决方案,可以将任何 2D 数组转换为 1D:

          function array2DTo1D($arr2D) {
              $i = 0; $j = 0;
              $arr1D = [];
              while (isset($arr2D[$i][0])) {
                  while (isset($arr2D[$i][$j])) {
                      $arr1D[] = $arr2D[$i][$j];
                      $j++;
                  }
                  $i++; $j = 0;
              }
              return $arr1D;
          }
          

          【讨论】:

            【解决方案8】:

            PHP 5.3之后有一个新的函数叫做arrray_walk_recursive

            $data = [1,2,[3,4],5,[6,7,8],9];
            $output = [];
            array_walk_recursive($data, function($val) use (&$output) {
                $output[] = $val;
            });
            

            注意$outputpassed by reference

            $output 将导致[1,2,3,4,5,6,7,8,9]

            【讨论】:

              猜你喜欢
              • 2011-07-26
              • 2017-01-19
              • 1970-01-01
              • 1970-01-01
              • 2011-07-23
              • 2013-11-23
              • 1970-01-01
              • 1970-01-01
              • 2017-04-12
              相关资源
              最近更新 更多