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

时间:2018-07-28 11:24:12

标签: php arrays

我只有一个数组,我需要在多维数组中进行转换,而无需使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>array_merge等,只是一个自治函数:

array_replace_recurcive

并转换为如下形式,最后一个键为值:

$single = [
    0 => 'one',
    1 => 'two',
    2 => 'tree',
    3 => 'four',
    4 => 'five'
];

如果有帮助,我已经创建了一个递归函数:

$multidimentional = [
    'one' => [
        'two' => [
            'tree' => [
                'four' => 'five'
            ]
        ]
    ]
];

4 个答案:

答案 0 :(得分:2)

您可以使用PHP(自5.6版开始)argument unpacking和一个非常简单的递归函数来完成此操作:

$single = [
    0 => 'one',
    1 => 'two',
    2 => 'tree',
    3 => 'four',
    4 => 'five'
];

function convert($key, ...$values) {
    if (count($values) == 1)
        return array($key => $values[0]);
    else
        return array($key => convert(...$values));
}

print_r(convert(...$single));

输出:

Array
(
    [one] => Array
        (
            [two] => Array
                (
                    [tree] => Array
                        (
                            [four] => five
                        )
                )
        )
)

您也可以不使用count(仅使用isset)来做到这一点:

function convert2($key, ...$values) {
    if (!isset($values[1]))
        return array($key => $values[0]);
    else
        return array($key => convert(...$values));
}

print_r(convert2(...$single));

输出:

Array
(
    [one] => Array
        (
            [two] => Array
                (
                    [tree] => Array
                        (
                            [four] => five
                        )
                )
        )
)

答案 1 :(得分:1)

以递归的方式思考,您可以编写一个基本案例,如果当前所见项目的值比数组的长度小1,则返回该值。

$singleDim = [
    0 => 'one',
    1 => 'two',
    2 => 'tree',
    3 => 'four',
    4 => 'five'
];

function toMultiDimArray($arr, $seen=0) {
    if ([] === $arr) {
        return [];
    }

    if(count($arr) - 1 === $seen) {
        return $arr[$seen];
    }

    return [
       $arr[$seen] => toMultiDimArray($arr, $seen+1)
    ];
}

$multiDim = toMultiDimArray($singleDim);

var_dump($multiDim);

array(1) {
  ["one"]=>
  array(1) {
    ["two"]=>
    array(1) {
      ["tree"]=>
      array(1) {
        ["four"]=>
        string(4) "five"
      }
    }
  }
}

答案 2 :(得分:1)

$single = [
    0 => 'one',
    1 => 'two',
    2 => 'tree',
    3 => 'four',
    4 => 'five'
];

function to_multidimentional($array, $count = 0, $seen = 0) {

    if($count - 1 === $seen) {
        return $array[$seen];
    }

    return [
       $array[$seen] => to_multidimentional($array, $count, $seen + 1)
    ];
}

$single = to_multidimentional($single, count($single));

print_r($single);

exit;

答案 3 :(得分:0)

对此没有任何递归。只是向后遍历$single数组,然后每次将结果嵌入到新键中:

function foo( $single ) {
    $multidimensional = [ $single[ count($single) - 1 ] ];

    for( $i = count($single) - 2; $i >= 0; $i--  ) {
      $multidimensional = [ $single[$i] => $multidimensional ];
    }
}