如何使用PHP将多维数组转换为单一数组?

13

在实现数据库查询后,我得到了以下多维数组。

二维数组

Array
(
    [0] => Array
        (
            [t1] => test1
        )

    [1] => Array
        (
            [t2] => test2
        )

    [2] => Array
        (
            [t3] => test3
        )

    [3] => Array
        (
            [t4] => test4
        )

    [4] => Array
        (
            [t5] => test5
        )

)

但我想将它转换为单一维度的数组,格式如下:

单一维度数组

Array (
    t1 => test1
    t2 => test2
    t3 => test3
    t4 => test4
    t5 => test5
)

我该怎么做?


1
它是通过MySQL查询动态生成的。在HTML中,你会看到什么?@AbdulWaheed - Karan Adhikari
展示创建第一个数组的代码,那里是你遇到问题的地方。 - RiggsFolly
1
可能是将多维数组转换为一维数组的重复问题。 - Rahul
@RyanVincent 这个问题有多个答案,包含不同的解决方案。但我认为这个问题对其他人很有帮助,却没有得到足够的关注。我使用了“悬赏”功能来向其他用户展示这个问题,并获得了新的解决方案。 - Mohammad
@RyanVincent Stackoverflow 将会评判。 获胜的最高票答案必须至少从2分开始才能获得赏金 - Mohammad
显示剩余4条评论
18个回答

10

我认为你可以使用array_reduce()函数。
例如:

   $multi= array(0 => array('t1' => 'test1'),1 => array('t2' => 'test2'),2 => array('t3' => 'test3'),3 => array('t4' => 'test4'));
   $single= array_reduce($multi, 'array_merge', array());
   print_r($single);  //Outputs the reduced aray

5
你可以按照以下方式使用:

示例:

$newArray = array();
foreach($arrayData as $key => $value) {
    foreach($value as $key2 => $value2) {
        $newArray[$key2] = $value2;
    }
}

其中 $arrayData 是您的数据库数据数组,$newArray 将是结果。


1
最好修复问题的根源,而不是摆弄坏数据。 - RiggsFolly

5
假设源数组是一个包含多个数组的数组,并且没有相同的键:
<?php
$src = [
    ['t1'=>'test1'],
    ['t2'=>'test2'],
    ['t3'=>'test3'],
    ['t4'=>'test4'],
    ['t5'=>'test5'],
];
$result = call_user_func_array('array_merge', $src);

通过var_dump()返回的结果:

array(5) {
  ["t1"]=>
  string(5) "test1"
  ["t2"]=>
  string(5) "test2"
  ["t3"]=>
  string(5) "test3"
  ["t4"]=>
  string(5) "test4"
  ["t5"]=>
  string(5) "test5"
}

3
你可以使用array_reduce()函数来更改数组的值。在回调函数中,使用key()获取项目的键,并使用reset()选择第一个项目。
$newArr = array_reduce($oldArr, function($carry, $item){
    $carry[key($item)] = reset($item);
    return $carry;
});

演示中检查结果。

3
尝试使用这个函数,
function custom_function($input_array)
{
    $output_array = array();
    for ($i = 0; $i < count($input_array); $i++) {
        for ($j = 0; $j < count($input_array[$i]); $j++) {
            $output_array[key($input_array[$i])] = $input_array[$i][key($input_array[$i])];
        }
    }
    return $output_array;
}

$arr = custom_function($arr);
print_r($arr);

试一下,它会起作用的。


2
您可以使用这个。
<?php
$temp = array(array('t1' => 'test1'), array('t2' => 'test2'), array('t3' => 'test3'), array('t4' => 'test4'), array('t5' => 'test5'));

$result_array = array();
foreach ($temp as $val) {
  foreach ($val as $key => $inner_val) {
    $result_array[$key] = $inner_val;
  }
}
print_r($result_array);

?>

2
最好修复问题的根源,而不是摆弄坏数据。 - RiggsFolly

2
// Multidimensional array
$arrdata = Array(
    '0' => Array(
        't1' => 'test1'
    ) ,
    '1' => Array(
        't2' => 'test2'
    ) ,
    '2' => Array(
        't3' => 'test3'
    )
);

// Convert to a single array
$data = array();
foreach($arrdata as $key => $value) {
    foreach($value as $key1 => $value1) {
        $data[$key1] = $value1;
    }
}
echo $data;

2
针对您的具体情况,我建议使用array_reduce函数,并将初始值设置为空数组。
array_reduce($arr, function($last, $row) {
    return $last + $row;
}, array());

PHP 7.4之后

array_reduce($arr, fn ($last, $row) => $last + $row, []);

结果:

[
    't1' => 'test1',
    't2' => 'test2',
    't3' => 'test3',
    't4' => 'test4',
    't5' => 'test5'
]

2
尝试使用数组映射函数。
$singleDimensionArray = array_map('current',$multiDimensionArray);

2

如果您不关心保留正确的数组键,则可以使用此选项。

function flattenA(array $array) {
    $return = array();
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
    return $return;
}
print_r(flattenA($arr));
// Output
Array
(
    [0] => test1
    [1] => test2
    [2] => test3
    [3] => test4
    [4] => test5
)

Otherwise

function flattenB(array $array) {
    $return = array();
    array_walk_recursive($array, function($v,$k) use (&$return) { $return[$k] = $v; });
    return $return;
}
print_r(flattenB($arr));
// Output
Array
(
    [t1] => test1
    [t2] => test2
    [t3] => test3
    [t4] => test4
    [t5] => test5
)

请在Sandbox上进行检查。

来自类似问题的答案


根据OP的问题,对输出进行了编辑以保持正确的数组键。 - user2560539

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