Обеспечить порядок в цикле с участием json_decode ()

я использую 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

Решение

Обычно, когда я работаю с необработанными данными в порядке, не идеальном для работы, я запускаю первый проход цикла, чтобы сгенерировать список индексов, которые я должен пройти во второй раз.
Итак, быстрый пример из вашего кода:

<?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
}
}
?>

Конечно, вы можете сделать это более общими способами, чтобы он был чище (т.е. генерировать как первое, так и второе условия в индексах), но я думаю, вы поняли идею 🙂

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;
}
}

}
?>
0

По вопросам рекламы [email protected]