确保涉及json_decode()的for循环中的顺序

时间:2014-11-14 23:15:27

标签: php json implode

我使用json_decode来解析JSON文件。在for循环中,我尝试捕获JSON中存在一个或另一个元素的特定情况。我已经实现了一个似乎符合我需求的功能,但我发现我需要使用两个for循环才能让它捕获我的两个案例。

我宁愿使用一个循环,如果可能的话,但我仍然坚持如何在一次通过中捕获这两个案例。这是我希望结果看起来像的模型:

<?php
function extract($thisfile){
    $test = implode("", file($thisfile));
    $obj = json_decode($test, true);

    for ($i = 0; $i <= sizeof($obj['patcher']['boxes']); $i ++) {
        //this is sometimes found 2nd
        if ($obj['patcher']['boxes'][$i]['box']['name'] == "mystring1") {
        }

        //this is sometimes found 1st
        if ($obj['patcher']['boxes'][$i]['box']['name'] == "mystring2") {
        }
    }    
}
?>

任何人都可以告诉我如何在一次迭代中捕获上述两种情况? 我显然不能做像

这样的事情
if ($obj['patcher']['boxes'][$i]['box']['name'] == "string1" && $obj['patcher']['boxes'][$i]['box']['name'] == "string2") {}

...因为这种情况永远不会得到满足。

2 个答案:

答案 0 :(得分:0)

一般来说,当我的原始数据处于不适合使用的顺序时,我所做的就是运行第一个循环传递以生成一个索引列表,供我第二次传递。 这是代码中的一个简单示例:

<?php
function extract($thisfile){
    $test = implode("", file($thisfile));
    $obj = json_decode($test, true);

    $index_mystring2 = array(); //Your list of indexes for the second condition

    //1st loop.
    $box_name;
    for ($i = 0; $i <= sizeof($obj['patcher']['boxes']); $i ++) {
        $box_name = $obj['patcher']['boxes'][$i]['box']['name'];

        if ( $box_name == "mystring1") {
             //Do your code here for condition 1
        }

        if ($box_name == "mystring2") {
           //We push the index onto an array for a later loop.
           array_push($index_mystring2, $i); 
        }
    }

    //2nd loop
    for($j=0; $j<=sizeof($index_mystring2); $j++) {
      //Your code here. do note that $obj['patcher']['boxes'][$j]
      // will refer you to the data in your decoded json tree
    }
}
?>

当然,你可以用更通用的方式做到这一点,以便它更清洁(即,将第一和第二条件都生成到索引中),但我认为你明白了这一点:)

答案 1 :(得分:0)

我发现@Jon所提到的东西可能是解决这个问题的最佳方式,至少对我来说是这样的:

<?php
function extract($thisfile){
    $test = implode("", file($thisfile));
    $obj = json_decode($test, true);
    $found1 = $found2 = false;

    for ($i = 0; $i <= sizeof($obj['patcher']['boxes']); $i ++) {
        //this is sometimes found 2nd
        if ($obj['patcher']['boxes'][$i]['box']['name'] == "mystring1") {
            $found1 = true;
        }

        //this is sometimes found 1st
        if ($obj['patcher']['boxes'][$i]['box']['name'] == "mystring2") {
            $found2 = true;
        }

        if ($found1 && $found2){ 
            break;
        }
    }    

}
?>