PHP - 如何将单个数组转换为多维数组?

时间:2017-07-22 12:53:49

标签: php arrays multidimensional-array logic

我有一个像:

这样的数组
array (
    '0' => 1,
    '1' => 3,
    '2' => 4
)

我想把它变成一个多维数组,如:

array (
    '1' =>
        array (
            '3' => '4'
        ),
)

另一个单一阵列:

array (
    '0' => 'a',
    '1' => 'b',
    '2' => 'c',
    '3' => 'd'
)

到:

array (
    'a' =>
        array (
            'b' =>
                array (
                    'c' => 'd'
                ),
        ),
),

我怎样才能做到这一点?

注意
该数组是动态的,并不总是包含3或4个元素。

3 个答案:

答案 0 :(得分:0)

如果它总是有3个元素:

  $temp = array (
            '0' => 1,
            '1' => 3,
            '2' => 4
        ); 

  $result = array();

  $result[$temp['0']] = array($temp['1'] => $temp['2']);

答案 1 :(得分:0)

虽然我认为有更好的策略,但可以将eval()用于此目的:

autocomplete="nope"

结果:

<?php

/* Example array */
$arr1 = array(
    '0' => 'a',
    '1' => 'b',
    '2' => 'c',
    '3' => 'd'
);

$array_string = '';

/* Build array string */
for($i = 0; $i < count($arr1); $i++){
    if($i < (count($arr1) - 1)){
        $array_string .= 'array ( \''. $arr1[$i] .'\' => ';
    } else {
        $array_string .= ' \''. $arr1[$i] .'\'';
    }
}

/* Close array string */
for($y = 0; $y < count($arr1); $y++){
    if($y < (count($arr1) - 2)){
        $array_string .= ' ), ';
    } else {
        $array_string .= ' )';
        break;
    }
}

/* Evaluate array string as PHP code and put it in $result */
$result = eval("return $array_string;");

/* Print the result */
echo '<pre>';
print_r($result);
echo '</pre>';

?>

但正如我所说,记住这句话:

  

如果eval()是答案,你几乎肯定会问错误的问题。 - Rasmus Lerdorf,PHP的BDFL

问问自己为什么需要这个。是否有其他策略可用于您想要的内容?

答案 2 :(得分:0)

有多种方法可以实现这一目标:

简单 for 循环

首先,使用array_pop() pop (即存储和删除)数组中的最后一个值。然后从数组的末尾迭代,连续创建一个包含值的数组(通过array_values()):

function transformArray($input) {
    $accumulator = array_pop($input);
    $values = array_values($input);
    for($i = count($input)-1; $i > -1; $i--) {
        $accumulator = array($values[$i] => $accumulator);    
    }
    return $accumulator;
}

this playground example

中演示的内容

foreach循环

使用上一个示例中的代码,for循环可以使用foreach替换为array_reverse()循环。这样我们就不必担心何时开始和停止索引值,索引到数组等等。

function transformArray($input) {
    $accumulator = array_pop($input);
    $values = array_reverse(array_values($input));
    foreach($values as $value) {
        $accumulator = array($value => $accumulator);    
    }
    return $accumulator;
}

this playground example中看到它。

功能方法:array_reduce()

Array_reduce()可用于简化迭代。 array_reduce()的第一个参数是输入数组,第二个是回调函数,第三个是初始值。回调函数的参数是 accumulator 值(来自先前的迭代)和当前数组索引处的数组元素。初始值用作第一次迭代的累加器值,因此我们可以传递从数组末尾弹出的值。

function transformArray($input) {
    $accumulator = array_pop($input);
    $values = array_reverse(array_values($input));
    return array_reduce($values, function($accumulator, $element) {
        return array($element => $accumulator);
    }, $accumulator);
}

this playground example中看到它。

递归方法

也许最简单的技术是使用递归函数,通过使用array_shift()从数组中取出第一个元素并返回一个以该元素为键的数组,该值是调用相同函数的返回值,除非只有一个项目,在这种情况下返回一个项目。

function transformArray($input) {
    if (count($input) == 1) {
        return $input[0];
    }
    return array(array_shift($input) => transformArray($input));
}

this playground example中看到它。