在PHP中将二维多维数组转换为一维数组

8

请问有人在php中将二维数组转换为一维数组吗?我尚未找到清晰的php解释。如有建议,将不胜感激。


3
适当的背景信息可以起到事半功倍的效果。 - George Cummins
你这样做的目的是什么?你只是想毫无意义地展开数组,还是你不想要子数组?或者你有这方面的需求吗? - Patrick
我正在寻找通用的解释,以便其他遇到类似问题但上下文不同的人可以使用。然而,在这个二维数组的每个插槽中,我有osm格式的二维点。这个一维数组是我编写的一个函数的输入。 - John
有通用的方法可以循环遍历2D数组的值,并将它们顺序地附加到新数组中。然而,在像你这样的情况下,我假设元素的顺序很重要。你考虑过为现有函数编写一个包装器吗?该包装器接受2D数组并将其转换为现有函数所需的特定格式。 - George Cummins
是的,乔治,那将是一个不错的解决方案。谢谢。然而,我需要改变许多相互依存的函数,不幸的是时间非常紧迫。 - John
7个回答

16

如果您正在从查询中获取值,这可能对您有所帮助。在此处,您可以使用数组函数,它将支持PHP 5.5+。

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

告别循环!享受智能代码。


9

试试这个:

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没有索引值。 - John
3
在不提供索引的情况下给数组赋值,意味着该值将被追加到数组的末尾。 - Doug
抱歉,@Doug,我不知道那个,所以谢谢。我已经完全按照这样写了,但我认为它不会填满数组,只是在每个for循环迭代中继续填充到某个数,并覆盖插槽。再次感谢您。 - John
@Doug,你不需要在 for 语句的末尾添加 $i++$j++ 吗? - SAVAFA

1

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


1

Try this one:

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

请注意,它包括一个测试以查看值是否设置(非空)。将行长度不同的数组 转置 成为的数组将在某些单元格中具有 null 值,如果您试图线性化这种“野兽”,则此检查可能会有所帮助。


1
你在处理数组中有大量某物且只想要一个代表它们的某物时,首先应该考虑使用array_reduce()。在PHP文档中,

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

对于2D => 1D数组转换,某物数组;我们在一个数组中有很多这样的数组,但我们只需要一个数组本身。
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)
}

0

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

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

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

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;
}

0

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;
});

请注意,$output是通过引用传递的(passed by reference)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接