首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中迭代深度嵌套数组

在PHP中迭代深度嵌套数组
EN

Stack Overflow用户
提问于 2016-05-12 14:43:05
回答 2查看 614关注 0票数 1

我将数据保存为JSON格式(Prestashop) --我需要访问该数据--这些数据深深嵌套在数组中。

以下是功能:

代码语言:javascript
复制
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,我看到了这个(我格式化它是为了让我自己更容易阅读):

代码语言:javascript
复制
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) 
                } 
            } 
        } 
    } 
} 

获得深度嵌套数组的“值”部分的最简单方法是什么?

这必须是相当动态的,因为取决于这个用户拥有的项的数量-数组的数量将发生变化。在本例中,有2项(每一项在“value”中有2项)。如果用户愿意,可以添加3项或4项或10项。但我只是试图获得“value”,并将该JSON转换为HTML,以便传递给它的视图。

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

JSON数据如下所示:

代码语言:javascript
复制
[
    [{
        "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": ""
    }]
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-19 12:05:44

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

然后,我在JSON中执行了json_decode并遍历了它。

票数 0
EN

Stack Overflow用户

发布于 2017-02-22 19:48:25

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

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

让我们说这是你的数组

代码语言:javascript
复制
$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,
                ],
            ],
        ],
    ],
];

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

代码语言:javascript
复制
/**
 * @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)));

应给予

代码语言:javascript
复制
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":""}]]"
}    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37190297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档