在PHP中遍历深度嵌套数组

在PHP中遍历深度嵌套数组,php,json,iteration,prestashop,Php,Json,Iteration,Prestashop,我有以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,

我有以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,我会看到这一点(我对其进行了格式化,使其更易于阅读):

获取深度嵌套数组的[“value”]部分的最简单方法是什么

这必须是相当动态的,因为根据用户拥有的项目数量,数组的数量将发生变化。在本例中,共有2个项目(每个项目的“值”中有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_解码,并在json上进行了迭代。

我最后只是嵌套了一堆foreach语句,直到找到了我想要的数组。这是丑陋的,但功能

然后我对json进行了解码,并对其进行了迭代。

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

假设这是你的数组

$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":""}]]"
}    

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

假设这是你的数组

$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":""}]]"
}    

这条线返回的是什么<代码>$datas=json_decode($datas[datas])我可能会在这之后放置一个var_转储进行调试。我在那里放置了一个var_转储,但没有看到任何东西。这是(我相信)因为这只是传递给视图(模板文件),所以如果.tpl中没有列出任何内容来显示var_转储,它将不会显示。我不能谈论您的确切体系结构,但在这种情况下,var_转储后跟
die
通常可以满足我的需要。或者,您可以使用
error\u log
更新问题以包括var\u转储-我关闭了缓存,覆盖开始按预期工作。没有
[“values”]
数组。此行返回的是什么<代码>$datas=json_decode($datas[datas])我可能会在这之后放置一个var_转储进行调试。我在那里放置了一个var_转储,但没有看到任何东西。这是(我相信)因为这只是传递给视图(模板文件),所以如果.tpl中没有列出任何内容来显示var_转储,它将不会显示。我不能谈论您的确切体系结构,但在这种情况下,var_转储后跟
die
通常可以满足我的需要。或者,您可以使用
error\u log
更新问题以包括var\u转储-我关闭了缓存,覆盖开始按预期工作。没有
[“values”]
数组。欢迎使用。请不要只提供链接答案:链接可能会被破坏,答案变得无关紧要。相反,把最重要的部分直接放到你的帖子上。谢谢你,我也很感谢你的建议@YakovLWelcome to SO。请不要只提供链接答案:链接可能会被破坏,答案变得无关紧要。相反,把最重要的部分直接放到你的帖子上。谢谢你,我也很感谢你的建议@YakovL