【问题标题】:Multidimensional array flattening technique still leaves empty arrays多维数组展平技术仍然会留下空数组
【发布时间】:2020-09-17 03:21:11
【问题描述】:

有许多关于 S/O 的参考资料展示了展平多维递归数组(具有两个以上级别)的各种方法。我已经经历了几十次(并且尝试过最多),但我尝试过的每一个仍然遇到一个奇怪的问题。结果我得到的是:

Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000043
    [1] => 1000045
    [2] => 1000050
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000030
    [1] => 1000032
    [2] => 1000058
    [3] => 1000064
) ...

但我期待的是一个真正扁平化的单个数组:

Array
    [0] => 1000043
    [1] => 1000045
    [2] => 1000050
    [3] => 1000030
    [4] => 1000032
    [5] => 1000058
    [6] => 1000064
)

我在 S/O 上找到的方法应该处理“空数组”(我认为这是问题所在),但我仍然得到错误的输出。这是我的代码:

function array_flatten5(array $array)
{
    $flat = array(); // initialize return array
    $stack = array_values($array); // initialize stack
    while($stack) // process stack until done
    {
        $value = array_shift($stack);
        if (is_array($value)) // a value to further process
        {
            $stack = array_merge(array_values($value), $stack);
        }
        else // a value to take
        {
           $flat[] = $value;
        }
    }
    return $flat;
}

有人可以指出我在这里遗漏了什么,因为我认为这很简单,但此时我的眼睛被我所做的尝试次数所困扰。感谢您提供的任何帮助。

这是原始数组。它是 4 深:

Array ( [0] => 1000043 [1] => 1000045 [2] => 1000050 ) Array ( [0] => 1000030 [1] => 1000032 [2] => 1000058 [3] => 1000064 ) Array ( [0] => 1000041 [1] => 1000059 [2] => 1000069 ) Array ( [0] => 1000021 [1] => 1000044 [2] => 1000049 [3] => 1000071 ) Array ( [0] => 1000009 [1] => 1000013 [2] => 1000015 [3] => 1000017 [4] => 1000053 ) Array ( [0] => 1000022 [1] => 1000034 [2] => 1000070 ) Array ( [0] => 1000038 [1] => 1000047 [2] => 1000055 [3] => 1000063 ) Array ( [0] => 1000019 [1] => 1000054 [2] => 1000060 [3] => 1000066 [4] => 1000068 ) Array ( [0] => 1000006 [1] => 1000014 [2] => 1000016 [3] => 1000072 ) Array ( [0] => 1000024 [1] => 1000025 [2] => 1000046 [3] => 1000061 [4] => 1000067 ) Array ( [0] => 1000028 [1] => 1000039 [2] => 1000048 ) Array ( [0] => 1000042 [1] => 1000057 ) Array ( [0] => 1000027 [1] => 1000033 [2] => 1000036 [3] => 1000037 ) Array ( [0] => 1000008 [1] => 1000010 [2] => 1000012 [3] => 1000018 ) Array ( [0] => 1000026 [1] => 1000062 [2] => 1000065 ) Array ( [0] => 1000020 [1] => 1000023 [2] => 1000031 [3] => 1000035 [4] => 1000040 ) Array ( [0] => 1000007 [1] => 1000011 [2] => 1000029 ) Array ( [0] => 1000051 [1] => 1000052 [2] => 1000056 ) Array ( [0] => 1000001 [1] => 1000002 [2] => 1000003 [3] => 1000004 [4] => 1000005 ) Array ( [0] => 1000073 )

这是使用 array_walk_recursive 建议的结果...

Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000111
    [1] => 1000113
    [2] => 1000129
    [3] => 1000134
)
Array
(
)
Array
(
)
Array
(
    [0] => 1000012
    [1] => 1000085
)
Array
(
) ...

【问题讨论】:

  • 查看产生此结果的输入数组会很有帮助。
  • @Nick ...谢谢你的建议。我已经添加到原帖。非常感谢。
  • 专家您好!我真的可以在这里使用一些方向。我敢肯定这可能是我错过的一些小事,但我只是没有看到它。你能花几分钟时间提供一些建议吗?谢谢!
  • 您提供的源数据是一组 1-deep 数组。能否请您提供原始的 4 深阵列?

标签: php arrays recursion flatten


【解决方案1】:

您没有准备合适的数组,但查看此代码您可能只需要array_walk_recursive() 函数。

$array = [
    [1, 2, 3, 4],
    [[5, 6], [7, 8]],
    [[[9], [10]], [11]]
];

$result = [];
array_walk_recursive($array, function ($tempV) use (&$result) {
    $result[] = $tempV;
});

print_r($result);

输出:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
)

【讨论】:

  • 感谢您的意见。数据库服务器现在已经关闭(维护),所以我无法测试你的想法,但我会尽快。同时,您能否解释一下您的评论“您没有准备合适的阵列”?您是指我在问题中提供的内容,还是您指的是我最初设置 SQL 查询时的内容(这意味着查询一开始就设计得很糟糕)?我问是因为我是新手,想尽可能多地学习。谢谢!
  • 是的,您应该将数组粘贴为 PHP 代码。无法使用 print_r 的结果。
  • 明白。谢谢你的澄清。我将在 S/O 上寻找示例,以确保我将来会这样做。一旦我能够测试您的代码,我将返回更新。感谢支持!
  • 你测试解决方案了吗?
  • 感谢您的跟进。我的托管服务运行了更新并损坏了我的数据库,所以我一直在与他们争夺修复。因此,我无法测试您的解决方案。我正在重建/恢复它,但要到明天才能完成。这对我来说非常令人沮丧,所以我再次为没有关闭循环而道歉。我会尽快更新。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 2012-08-27
  • 2023-03-23
  • 2020-06-06
  • 1970-01-01
  • 2013-09-12
  • 2011-09-05
  • 2010-11-22
相关资源
最近更新 更多