【问题标题】:PHP, Get values from (Mutli) Multidimensional ArrayPHP,从(Mutli)多维数组中获取值
【发布时间】:2013-12-14 12:16:09
【问题描述】:

我有一个多维数组,我正在尝试使用 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
                                                                                        )

                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

以上部分从[product] 重复每个产品 ID ([pid]) - 我无法将整个数组放入帖子中,所以这里有一个链接 - http://pastebin.com/0qgh5scG

我想要实现的是将数组中每个产品 ID [pid] 的名称描述和 EACH Monthly* 价格提取到它自己的数组中,该数组变量名称是关联的 [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] 值命名。但我认为这对我来说是一个单独的问题/挑战。

我希望我在上面说得通。我是数组的新手,在搜索了很多示例时,没有发现任何具有像上述那样复杂的数组,或者具有唯一命名的部分。

【问题讨论】:

  • api 的数组结构没有多大意义。他们的文档有解释吗?
  • 我知道!这是WHMCS 的 API(计费“解决方案”)。老实说,他们的文档在这样的事情上并不是很好。支持还有很多不足之处。

标签: php arrays multidimensional-array foreach


【解决方案1】:

首先,这个 $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;
    }

}

【讨论】:

  • 这非常有效。谢谢你。我期待着分析您的答案的要素。附言您在echo "Options: \n" 末尾缺少一个结束;
  • P.P.S.使用$pricing 变量,我重命名了一些变量,并忘记在粘贴代码之前将它们全部更改回来。已更新问题。
【解决方案2】:

首先,查看数组结构,“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'];

}

试试看。我认为这应该可行。

P.S.:他们真的应该在他们的最后弄清楚关于那个 API 的一些东西,因为这是一个可怕的数组。没有理由这样做。

【讨论】:

  • 抱歉,我不是 100% 确定您的意思是什么?
  • 我实际上刚刚看到 api 允许我以 JSON 格式提取结果。所以使用json_decode($arr, true); 我可以将结果格式化为一个更友好的关联数组!我不知道为什么他们(WHMCS)给了我以上作为获取数组的主要方式!
  • 我似乎收到了syntax error, unexpected T_VARIABLE 错误与您的上述功能。但我看不出其中缺少什么。
  • 您在第二个 if 之后缺少一个结束 )
  • 好的。我又试了一次,但收到traverseArray($arr); 行的“语法错误,意外的 T_STRING”错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2012-04-26
  • 2012-08-10
  • 2015-05-20
相关资源
最近更新 更多