我使用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") {}
...因为这种情况永远不会得到满足。
答案 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;
}
}
}
?>