簡體   English   中英

PHP,從(Mutli)多維數組獲取值

[英]PHP, Get values from (Mutli) Multidimensional Array

我有一個多維數組,試圖從中使用foreach提取值。

它檢索為JSON格式,因此我使用json_decode將其轉換為關聯數組。

該數組包含各種產品的價格信息。 我正在努力解決的問題是,每個產品都包含多個嵌套數組。

因此,我不確定如何將其集成到foreach

數組$ arr:

Array
(
    [result] => success
    [totalresults] => 3
    [products] => Array
        (
            [product] => Array
                (
                    [0] => Array
                        (
                            [pid] => 2
                            [gid] => 2
                            [type] => other
                            [name] => Shared Hosting
                            [description] => Shared Cloud
                            [module] => custom server
                            [paytype] => onetime
                            [pricing] => Array
                                (
                                    [GBP] => Array
                                        (
                                            [prefix] => £
                                            [suffix] =>  GBP
                                            [msetupfee] => 0.00
                                            [qsetupfee] => 0.00
                                            [ssetupfee] => 0.00
                                            [asetupfee] => 0.00
                                            [bsetupfee] => 0.00
                                            [tsetupfee] => 0.00
                                            [monthly] => 0.00
                                            [quarterly] => -1.00
                                            [semiannually] => -1.00
                                            [annually] => -1.00
                                            [biennially] => -1.00
                                            [triennially] => -1.00
                                        )

                                )

                            [customfields] => Array
                                (
                                    [customfield] => Array
                                        (
                                        )

                                )

                            [configoptions] => Array
                                (
                                    [configoption] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [id] => 2
                                                    [name] => Years
                                                    [type] => 2
                                                    [options] => Array
                                                        (
                                                            [option] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [id] => 2
                                                                            [name] => 1 Year
                                                                            [recurring] =>
                                                                            [pricing] => Array
                                                                                (
                                                                                    [GBP] => Array
                                                                                        (
                                                                                            [msetupfee] => 0.00
                                                                                            [qsetupfee] => 0.00
                                                                                            [ssetupfee] => 0.00
                                                                                            [asetupfee] => 0.00
                                                                                            [bsetupfee] => 0.00
                                                                                            [tsetupfee] => 0.00
                                                                                            [monthly] => 69.00
                                                                                            [quarterly] => 0.00
                                                                                            [semiannually] => 0.00
                                                                                            [annually] => 0.00
                                                                                            [biennially] => 0.00
                                                                                            [triennially] => 0.00
                                                                                        )

                                                                                )

                                                                        )

                                                                    [1] => Array
                                                                        (
                                                                            [id] => 5
                                                                            [name] => 2 Years
                                                                            [recurring] =>
                                                                            [pricing] => Array
                                                                                (
                                                                                    [GBP] => Array
                                                                                        (
                                                                                            [msetupfee] => 0.00
                                                                                            [qsetupfee] => 0.00
                                                                                            [ssetupfee] => 0.00
                                                                                            [asetupfee] => 0.00
                                                                                            [bsetupfee] => 0.00
                                                                                            [tsetupfee] => 0.00
                                                                                            [monthly] => 138.00
                                                                                            [quarterly] => 0.00
                                                                                            [semiannually] => 0.00
                                                                                            [annually] => 0.00
                                                                                            [biennially] => 0.00
                                                                                            [triennially] => 0.00
                                                                                        )

                                                                                )

                                                                        )

                                                                    [2] => Array
                                                                        (
                                                                            [id] => 8
                                                                            [name] => 3 Years
                                                                            [recurring] =>
                                                                            [pricing] => Array
                                                                                (
                                                                                    [GBP] => Array
                                                                                        (
                                                                                            [msetupfee] => 0.00
                                                                                            [qsetupfee] => 0.00
                                                                                            [ssetupfee] => 0.00
                                                                                            [asetupfee] => 0.00
                                                                                            [bsetupfee] => 0.00
                                                                                            [tsetupfee] => 0.00
                                                                                            [monthly] => 276.00
                                                                                            [quarterly] => 0.00
                                                                                            [semiannually] => 0.00
                                                                                            [annually] => 0.00
                                                                                            [biennially] => 0.00
                                                                                            [triennially] => 0.00
                                                                                        )

                                                                                )

                                                                        )

                                                                    [3] => Array
                                                                        (
                                                                            [id] => 11
                                                                            [name] => 4 Years
                                                                            [recurring] =>
                                                                            [pricing] => Array
                                                                                (
                                                                                    [GBP] => Array
                                                                                        (
                                                                                            [msetupfee] => 0.00
                                                                                            [qsetupfee] => 0.00
                                                                                            [ssetupfee] => 0.00
                                                                                            [asetupfee] => 0.00
                                                                                            [bsetupfee] => 0.00
                                                                                            [tsetupfee] => 0.00
                                                                                            [monthly] => 552.00
                                                                                            [quarterly] => 0.00
                                                                                            [semiannually] => 0.00
                                                                                            [annually] => 0.00
                                                                                            [biennially] => 0.00
                                                                                            [triennially] => 0.00
                                                                                        )

                                                                                )

                                                                        )

                                                                    [4] => Array
                                                                        (
                                                                            [id] => 14
                                                                            [name] => 5 Years
                                                                            [recurring] =>
                                                                            [pricing] => Array
                                                                                (
                                                                                    [GBP] => Array
                                                                                        (
                                                                                            [msetupfee] => 0.00
                                                                                            [qsetupfee] => 0.00
                                                                                            [ssetupfee] => 0.00
                                                                                            [asetupfee] => 0.00
                                                                                            [bsetupfee] => 0.00
                                                                                            [tsetupfee] => 0.00
                                                                                            [monthly] => 1104.00
                                                                                            [quarterly] => 0.00
                                                                                            [semiannually] => 0.00
                                                                                            [annually] => 0.00
                                                                                            [biennially] => 0.00
                                                                                            [triennially] => 0.00
                                                                                        )

                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

對於每個產品ID( [pid] ),從[product]重復了以上部分-我無法在帖子中容納整個數組,因此這里是指向該產品的鏈接-http://pastebin.com/0qgh5scG

我要實現的是將數組中每個產品ID [pid]的名稱描述和每個月的價格*放入其自己的數組中,並將該數組變量名關聯為[pid]

*(每月價格實際上是每年的價格,這只是模塊將數據存儲在數據庫中的一種怪異方式)

我已經嘗試過foreach

$arr = json_decode($jsondata, true); # Decode JSON String

 foreach ($arr['products']['product'] as $num) {

    $pid = $num['pid'];

    $yearlycosts = $arr['configoptions']['configoption']['0']['options']['option'][0]['pricing']['GBP']['monthly'];

    echo $pid;
    echo $yearlycosts;
 }

產品ID可以正常獲取,但是究竟如何為每個產品ID [pid]提取多個[name]和相關的多個[monthly]值?

我現有的foreach內是否需要一個foreach

最終,我想將這些值傳遞給新數組,每個數組都以其對應的[pid]值命名。 但是我認為這對我來說是一個單獨的問題/挑戰。

我希望以上已講得通。 我是數組的新手,在搜索大量示例時,沒有發現具有與上述數組一樣復雜的數組或具有唯一命名的節的數組。

首先,這個$ pricing變量是從哪里來的? 您最初使用的是$ num。

是的,只是一個嵌套的foreach循環就可以做到這一點:

$arr = json_decode($jsondata, true); # Decode JSON String

foreach ($arr['products']['product'] as $num) {

    $pid = $num['pid'];

    echo "Product ID: ".$pid."\n";
    echo "Options: \n"

    $i = 1;

    foreach($num['configoptions']['configoption']['0']['options']['option'] as $option)
    {
        $name = $option['name'];
        $yearlycosts = $option['pricing']['GBP']['monthly'];

        echo " - Option ".$i.": ".$name." ($".$yearlycosts.")\n";

        ++$i;
    }

}

首先,看一下數組結構,“ CUSTOMFIELDS”只是一個空鍵,它不包含“ CONFIGOPTION”。

所以這:

echo $k['CUSTOMFIELDS'][CONFIGOPTIONS][CONFIGOPTION][OPTIONS][OPTION][NAME];
echo $k['CUSTOMFIELDS'][CONFIGOPTIONS][CONFIGOPTION][OPTIONS][OPTION][MONTHLY];

需要看起來像這樣:

echo $k[CONFIGOPTIONS][CONFIGOPTION][OPTIONS][OPTION][NAME];
echo $k[CONFIGOPTIONS][CONFIGOPTION][OPTIONS][OPTION][MONTHLY];

我想我可能會嘗試首先修復所有索引名稱,然后從那里使我的生活變得輕松。 我將使用此函數遍歷整個數組:

function traverseArray($array)
{ 
    // Loops through each element. If element again is array, function is recalled. If not, result is echoed.
    foreach($array as $key=>$value)
    { 
        if (is_array($value))
        { 
            traverseArray($value); 
        } else {
            if (preg_match("/[0-9]/", $key) && !isset($array[preg_replace("[0-9]", "", $key)])) 
                        $array[preg_replace("[0-9]", "", $key)] = $value;
        } 
    }
}

此函數(在此處找到: http//snipplr.com/view/10200/ ,並針對當前問題進行了修改)將遍歷整個數組,包括每個級別,並且如果該鍵從數組末尾刪除數字沒有數字不存在。 原因是其中的某些數組包含多個帶有鍵的數組,如OPTION,OPTION12,OPTION43等。如果存在同一級別中沒有數字的鍵,則將其保留。 現在,所有數字都從諸如PRICING,GBP等鍵中移走了。我們只剩下一些OPTION鍵,這些鍵的末尾都有數字。 然后,我們將能夠:

traverseArray($arr); // Goes through arrray and removes random numbers unless not possible

foreach($k['CONFIGOPTIONS']['CONFIGOPTION']['OPTIONS'] as $option) {

    echo $option['NAME'];
    echo $option['PRICING']['GBP']['MONTHLY'];

}

試試看。 我認為應該可以。

PS:他們真的應該對API有所了解,因為這是一個可怕的數組。 沒有任何理由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM