php 拼合二维数组,同时保留数字关联行键

lc8prwob  于 2023-01-16  发布在  PHP
关注(0)|答案(3)|浏览(177)

我需要将一个二维数组扁平化,使其成为一个一维数组,而不会在这个过程中丢失我的数字2级键。
样本数据:

[
    [2015 => '2015'],
    [2016 => '2016'],
    [2017 => '2017'],
    [2018 => '2018'],
    [2019 => '2019'],
    [2020 => '2020'],
    [2021 => '2021'],
    [2022 => '2022'],
    [2023 => '2023']
]

预期输出:

[
    2015 => '2015',
    2016 => '2016',
    2017 => '2017',
    2018 => '2018',
    2019 => '2019',
    2020 => '2020',
    2021 => '2021',
    2022 => '2022',
    2023 => '2023'
]

有可能得到这样的输出吗?

5lwkijsr

5lwkijsr1#

您可以执行简单的foreach循环:

<?php

$years = array(
    array(2015 => '2015'),
    array(2016 => '2016'),
    array(2017 => '2017'),
    array(2018 => '2018'),
    array(2019 => '2019'),
    array(2020 => '2020'),
    array(2021 => '2021'),
    array(2022 => '2022'),
    array(2023 => '2023')
);

foreach($years as $year) {
    $key = key($year);
    $value = current($year);
    $result[$key] = $value;
}

var_dump($result);
    • 输出:**
$result = [
    2015 => '2015',
    2016 => '2016',
    2017 => '2017',
    2018 => '2018',
    2019 => '2019',
    2020 => '2020',
    2021 => '2021',
    2022 => '2022',
    2023 => '2023'
];
mlnl4t2r

mlnl4t2r2#

$theArray = [ 
    [2020 => '2020'], [2021 => '2021'], [2022 => '2022'], [2023 => '2023'],
    [2015 => '2015'], [2016 => '2016'], [2017 => '2017'], [2018 => '2018'], [2019 => '2019']
];

$new = [];
foreach ( $theArray as $a) {
    $new[key($a)] = $a[key($a)];
}
ksort($new);
print_r($new);

结果

Array
(
    [2015] => 2015
    [2016] => 2016
    [2017] => 2017
    [2018] => 2018
    [2019] => 2019
    [2020] => 2020
    [2021] => 2021
    [2022] => 2022
    [2023] => 2023
)

当然,转到创建原始数组的代码并修改它以创建您想要的东西而不是它当前所做的事情可能会更有效。

unftdfkk

unftdfkk3#

我最初用这个规范页面关闭这个页面:How to Flatten a Multidimensional Array?咨询主持人后,建议重新打开此要求较窄的问题,而不是澄清另一页上每个答案的行为,因为另一页包含此问题可行和不可行的混合解决方案。
下面是一个相当全面的可行技术列表:
array_reduce()在PHP7.4的箭头函数语法中使用union运算符不会在全局作用域中生成变量。

var_export(
    array_reduce($array, fn($result, $row) => $result + $row, [])
);

array_reduce()使用带有PHP7.4箭头函数语法的array_replace()不会在全局作用域中生成任何变量。

var_export(
    array_reduce($array, fn($result, $row) => array_replace($result, $row), [])
);

将数据从递归迭代器方法转换为数组不会在全局作用域中生成变量。Demo

var_export(
    iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)))
);

array_walk()需要声明一个全局变量,它通过闭包中的引用进行修改,并调用key()Demo

$result = [];
array_walk($years, function($row) use(&$result) { $k = key($row); $result[$k] = $row[$k]; });
var_export($result);

array_walk_recursive()需要声明一个全局变量,并且在闭包中通过引用修改该变量,而无需调用key()Demo

$result = [];
array_walk_recursive($years, function($v, $k) use (&$result) { $result[$k] = $v; });
var_export($result);

嵌套foreach()循环在全局范围内生成多个变量,但不调用函数。Demo

$result = [];
foreach ($array as $row) {
    foreach ($row as $k => $v) {
        $result[$k] = $v;
    }
}
var_export($result);

还有其他一些可行的方法,它们使用手动脚本化的递归和生成器,但它们在可读性方面不太吸引人,而且对于这项任务来说可能是矫枉过正的(在我看来)。
现在来看看那些不能使用的方法,因为它们会丢失行中的数字关联键。不要将这些扁平化技术用于这个问题的数据集/需求。

Laravel的Arr::flatten()方法实现了手工编写的递归代码,它返回一个平面的索引数组--不适合这种情况。
Ouzo goodies的Array::flatten()方法uses array_walk_recursive()返回一个平面索引数组--不适合本例。

相关问题