为Javascript格式化PHP数组

时间:2016-08-26 14:45:51

标签: php arrays multidimensional-array

我们有一个多维数组,目前看起来像这样。

[totalsByYardHand] =>
  [Jon Doe] =>
    [Delivieries] => 6
    [Pickups] => 5
    [Errors] => 8
  [Fred] =>
    [Delivieries] => 6
    [Pickups] => 5
    [Errors] => 8

由于我们将此数组传递给JavaScript并希望维护顺序,因此我们需要将其正确格式化。我们想要采用数组并将其格式化。

Array
(
[totalsByYardHand] => Array
    (
        [0] => Array
            (
                [0] => Jon Doe
                [1] => Array
                    (
                        [0] => Array
                            (
                                [0] => Deliveries
                                [1] => 6
                            )

                        [1] => Array
                            (
                                [0] => Pickup
                                [1] => 6
                            )

                        [2] => Array
                            (
                                [0] => Errors
                                [1] => 1
                            )

                    )

            )

        [1] => Array
            (
                [0] => Fred
                [1] => Array
                    (
                        [0] => Array
                            (
                                [0] => Deliveries
                                [1] => 6
                            )

                        [1] => Array
                            (
                                [0] => Pickup
                                [1] => 6
                            )

                        [2] => Array
                            (
                                [0] => Errors
                                [1] => 1
                            )
                    )
            )
    )
)

我们最接近的尝试是像这样的递归函数,但无法弄清楚如何将原始数组中的数组键添加到新格式化的数组中。

function array_values_recursive($array)
{
    $array = array_values($array);
    for ($i = 0, $n = count($array); $i < $n; $i++) {
        $element = $array[$i];
        if (is_array($element)) {
            $array[$i] = $this->array_values_recursive($element);
        }
    }

    return $array;

}

2 个答案:

答案 0 :(得分:1)

这很有趣!我不擅长递归,所以我喜欢挑战!如果这是你想要的,请告诉我。

$testArray = [
    'totalsByYardHand' => [
        'Jon Doe' => [
            'Deliveries' => 6,
            'Pickups' => 5,
            'Errors' => 8
        ],
        'Fred' => [
            'Deliveries' => 8,
            'Pickups' => 5,
            'Errors' => 6
        ],
        'Mary Jane' => [
            'Deliveries' => 1,
            'Pickups' => 2,
            'Errors' => 4
        ],
    ]
];

function customArrayFormat($array) {
    $newArr = [];
    $arrayKeys = array_keys($array);
    for ($i=0; $i < count($array); $i++) { 
        $newArr[$i] = [
            0 => $arrayKeys[$i],
            1 => (is_array($array[$arrayKeys[$i]]) ? customArrayFormat($array[$arrayKeys[$i]]) : $array[$arrayKeys[$i]])
        ];
    }

    return $newArr;
}

print_r(customArrayFormat($testArray));

输出:

Array
(
    [0] => Array
        (
            [0] => totalsByYardHand
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => Jon Doe
                            [1] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => Deliveries
                                            [1] => 6
                                        )

                                    [1] => Array
                                        (
                                            [0] => Pickups
                                            [1] => 5
                                        )

                                    [2] => Array
                                        (
                                            [0] => Errors
                                            [1] => 8
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [0] => Fred
                            [1] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => Deliveries
                                            [1] => 8
                                        )

                                    [1] => Array
                                        (
                                            [0] => Pickups
                                            [1] => 5
                                        )

                                    [2] => Array
                                        (
                                            [0] => Errors
                                            [1] => 6
                                        )

                                )

                        )

                    [2] => Array
                        (
                            [0] => Mary Jane
                            [1] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => Deliveries
                                            [1] => 1
                                        )

                                    [1] => Array
                                        (
                                            [0] => Pickups
                                            [1] => 2
                                        )

                                    [2] => Array
                                        (
                                            [0] => Errors
                                            [1] => 4
                                        )

                                )

                        )

                )

        )

)

答案 1 :(得分:1)

我认为重写数组可能不那么聪明......现在函数只会将原始数据中的每个(键,值)对变为[key,value]数组。

function array_values_recursive($array)
{
    $ret = array();
    foreach($array as $key => $value) {
        if (is_array($value)) {
            $ret[] = array($key, $this->array_values_recursive($value));
        } else {
            $ret[] = array($key, $value);
        }
    }
    return $ret;
}

此外,当数组具有数字键时,它将与json_encode很好地配合,因为在这些情况下它将数组保持为数组。