PHP Laravel 5.5集合扁平化并保留整数键?

13

我有以下数组:

$array = [
    '2' => ['3' => ['56' => '2'], '6' => ['48' => '2']],
    '4' => ['4' => ['433' => '2', '140' => '2'], '8' => ['421' => '2', '140' => '2']],
    '5' => ['5' => ['88' => '4', '87' => '2']]
];
下面的代码(拍平)应该保留键并返回它,但为什么没有返回呢?
collect($array)->flatten(1);
[
    '3' => ['56' => '2'],
    '6' => ['48' => '2'],
    '4' => ['433' => '2', '140' => '2'],
    '8' => ['421' => '2', '140' => '2'],
    '5' => ['88' => '4', '87' => '2']
]

然而,它丢失了键,只返回数组结果 :/ 我使用不正确吗?我应该如何展开并保留键?


1
我不相信flatten支持保留键 - 如果较低级别的键不唯一,你会如何期望它工作? - iainn
好的,谢谢。事后回想起来,扁平化操作不保留键值也就说得通了。 - GTMeteor
2个回答

54

一种优雅的解决方案是使用mapWithKeys方法。这将扁平化您的数组并保留键:

collect($array)->mapWithKeys(function($a) {
    return $a;
});

mapWithKeys 方法遍历集合并将每个值传递给给定的回调函数。该回调应返回一个包含单个键/值对的关联数组。


3
使用箭头函数可以使代码更优雅/更简洁。仅适用于 PHP 7.4 及以上版本。 collect($array)->mapWithKeys(fn($a) => $a); - Ashraf Kamarudin
非常好,谢谢。由于 map 不会扁平化,拥有键的 map 会让人感到不直观。 - Joel Mellon
工作得很好。谢谢。 - Sanjok Dangol
2
可以使用collect($array)->flatMap(fn ($v) => $v)来实现同样的效果,这还有一个额外的好处,即使用“flat”一词使语句更具表现力,尽管fn ($v) => $v部分可能会破坏它。 - iSWORD

2

在这里不能使用 flatten()。我没有一个优雅的解决方案,但是我已经测试过了,它可以完美地处理你的数组:

foreach ($array as $items) {
    foreach ($items as $key => $item) {
        $newArray[$key] = $item;
    }
}

dd($newArray);

1
这个确实有效。尽量避免使用foreach,但它确实有效。谢谢。 - GTMeteor

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