遍历 PHP 中的深层嵌套数组

Iterate through deeply nested array in PHP

我有以 JSON 格式保存的数据 (Prestashop) - 我需要获取 的数据 - 深度嵌套在数组中。

函数如下:

public static function getAllCustomizedDatas($id_cart, $id_lang = null, $only_in_cart = true, $id_shop = null)
{
    $datas = parent::getAllCustomizedDatas($id_cart, $id_lang, $only_in_cart, $id_shop);
    var_dump($datas);
    /*
     * Iterate over $datas, you're looking for
     * [id_product][id_product_attribute][id_address_delivery][id_customization][datas]
     * Datas will contain an array of fields broken by their type. You can then decode
     * the ones that need to be decoded and return the result:
     */


    return $datas;
}

如果我 var_dump $datas 我看到了这个(我对其进行了格式化以使其更容易阅读):

array(1) {
    [8]=> array(1) { 
        [0]=> array(1) { 
            [0]=> array(2) { 
                [22]=> array(4) { 
                    ["datas"]=> array(1) { 
                        [1]=> array(1) { 
                            [0]=> array(9) { 
                                ["id_customization"]=> string(2) "22" 
                                ["id_address_delivery"]=> string(1) "0" 
                                ["id_product"]=> string(1) "8" 
                                ["id_customization_field"]=> string(1) "2" 
                                ["id_product_attribute"]=> string(1) "0" 
                                ["type"]=> string(1) "1" 
                                ["index"]=> string(1) "2" 
                                ["value"]=> string(615) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]" 
                                ["name"]=> string(20) "Client Customization" 
                            } 
                        } 
                    } 
                    ["quantity"]=> int(2) 
                    ["quantity_refunded"]=> int(0) 
                    ["quantity_returned"]=> int(0) 
                } 
                [23]=> array(4) { 
                    ["datas"]=> array(1) { 
                        [1]=> array(1) { 
                            [0]=> array(9) { 
                                ["id_customization"]=> string(2) "23" 
                                ["id_address_delivery"]=> string(1) "0" 
                                ["id_product"]=> string(1) "8" 
                                ["id_customization_field"]=> string(1) "2" 
                                ["id_product_attribute"]=> string(1) "0" 
                                ["type"]=> string(1) "1" 
                                ["index"]=> string(1) "2" 
                                ["value"]=> string(615) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]" 
                                ["name"]=> string(20) "Client Customization" 
                            } 
                        } 
                    } 
                    ["quantity"]=> int(2) 
                    ["quantity_refunded"]=> int(0) 
                    ["quantity_returned"]=> int(0) 
                } 
            } 
        } 
    } 
} 

到达深层嵌套数组的 ["value"] 部分的最简单方法是什么?

这必须是相当动态的,因为根据该用户拥有的项目数量,数组的数量会发生变化。在此示例中,有 2 个(每个在 'value' 中有 2 个项目)。如果用户愿意,他们可以添加 3、4 或 10 个项目。但我只是想到达 ['value'] 并将 JSON 转换为 HTML 以获取传递给的视图。

奖励:知道一种轻松遍历 JSON 数据的方法吗?

JSON 数据如下所示:

[
    [{
        "name": "item[1][line1]",
        "customization": "asdf"
    }, {
        "name": "item[1][line2]",
        "customization": ""
    }, {
        "name": "item[1][line3]",
        "customization": ""
    }, {
        "name": "item[1][line4]",
        "customization": ""
    }, {
        "name": "item[1][line5]",
        "customization": ""
    }, {
        "name": "item[1][line6]",
        "customization": ""
    }, {
        "name": "item[1][line7]",
        "customization": ""
    }],
    [{
        "name": "item[2][line1]",
        "customization": "asdf"
    }, {
        "name": "item[2][line2]",
        "customization": ""
    }, {
        "name": "item[2][line3]",
        "customization": ""
    }, {
        "name": "item[2][line4]",
        "customization": ""
    }, {
        "name": "item[2][line5]",
        "customization": ""
    }, {
        "name": "item[2][line6]",
        "customization": ""
    }, {
        "name": "item[2][line7]",
        "customization": ""
    }]
]

我最终只是嵌套了一堆 foreach 语句,直到我到达了我想要的数组。它很丑,但很实用。

然后我在 JSON 上做了 json_decode 并遍历了它。

https://packagist.org/packages/ishworkh/multi-level-array-iterator

这可能有助于遍历深层嵌套数组。然后使用键或层次信息来筛选出您需要的值。

假设这是你的数组

$array = [
    [
        [
            [
                [
                    "datas"             => [
                        [
                            [
                                "id_customization"       => "22",
                                "id_address_delivery"    => "0",
                                "id_product"             => "8",
                                "id_customization_field" => "2",
                                "id_product_attribute"   => "0",
                                "type"                   => "1",
                                "index"                  => "2",
                                "value"                  => '[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]',
                                "name"                   => "Client Customization",
                            ],
                        ],
                    ],
                    "quantity"          => 2,
                    "quantity_refunded" => 0,
                    "quantity_returned" => 0,
                ],
                [
                    [
                        [
                            [
                                "id_customization"       => "23",
                                "id_address_delivery"    => "0",
                                "id_product"             => "8",
                                "id_customization_field" => "2",
                                "id_product_attribute"   => "0",
                                "type"                   => "1",
                                "index"                  => "2",
                                "value"                  => '[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]',
                                "name"                   => "Client Customization",
                            ],
                        ],
                    ],
                    "quantity"          => 2,
                    "quantity_refunded" => 0,
                    "quantity_returned" => 0,
                ],
            ],
        ],
    ],
];

你可以创建一个这样的函数,它使用多级数组迭代器的迭代方法遍历所有嵌套数组并 产生找到的值。

/**
 * @param array $nestedArray
 *
 * @return Generator
 */
function extractValuesFromArray(array $nestedArray):Generator
{
    // $key is the local index key, which in this case should be 'value' we are looking to filter for
    foreach(\ArrayIterator\ArrayIteratorFacade::iterate($nestedArray) as $key => $ArrayElement)
    {
        if ('value' === $key)
        {
            yield $ArrayElement->getValue();
        }
    }
}

var_dump(iterator_to_array(extractValuesFromArray($array)));

应该给

array(2) {
  [0]=>
  string(643) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]"
  [1]=>
  string(643) "[[{"name":"item[1][line1]","customization":"asdf"},{"name":"item[1][line2]","customization":""},{"name":"item[1][line3]","customization":""},{"name":"item[1][line4]","customization":""},{"name":"item[1][line5]","customization":""},{"name":"item[1][line6]","customization":""},{"name":"item[1][line7]","customization":""}],[{"name":"item[2][line1]","customization":"asdf"},{"name":"item[2][line2]","customization":""},{"name":"item[2][line3]","customization":""},{"name":"item[2][line4]","customization":""},{"name":"item[2][line5]","customization":""},{"name":"item[2][line6]","customization":""},{"name":"item[2][line7]","customization":""}]]"
}