Php другое состояние в foreach - PullRequest
0 голосов
/ 09 января 2012

У меня проблема с условием if / elseif в виде foreach. Я искал много раз и действительно из идей. Итак, у меня есть этот массив:

Массив (

[0] => stdClass Object
    (
        [title] => main
        [value] => value1
    )

[1] => stdClass Object
    (
        [title] => other
        [value] => value2
    )

[2] => stdClass Object
    (
        [title] => second
        [value] => value3
    )

[3] => stdClass Object
    (
        [title] => other
        [value] => value4
    )

[4] => stdClass Object
    (
        [title] => other
        [value] => value5
    )

)

Как вы можете видеть, у obj0 есть title => main, а у obj2 есть title => second, остальные «title» устанавливаются на другие.

У меня есть этот foreach:

foreach ($objects as $object): 
    if($object->title == 'second') { 
        //this value is rarely added, so it must have a "priority" and be showed
        echo '<span></span>';
    } elseif($object->title == 'main') { 
        //i mostly want to show this, but not if $object->title has the value 'second'.
        echo '<div></div>';
    }
endforeach;

Этот цикл возвращает оба "span" и "div", которые я не хочу. Я не могу показать только title => "second" (если он есть) и title => "main", только если "second" не существует. Так что либо показывать промежутки, либо делить.

Надеюсь, я хорошо объяснил, если нет, то извиняюсь! Большое спасибо, и я очень ценю вашу помощь!

Marius

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Если любой из них может появиться в любой позиции в массиве - т.е. main может появиться до second (как это имеет место) - вам придется зациклить весь массив, прежде чем принимать решение, что отображать:

$main = $second = FALSE;
foreach ($objects as $object): 
    if($object->title == 'second') { 
        $second = TRUE;
        break; // Added as @PeterKrejci pointed out
    } elseif($object->title == 'main') { 
        $main = TRUE;
    }
endforeach;

if($second) { 
    echo '<span></span>';
} elseif($main) { 
    echo '<div></div>';
}

Если second всегда будет появляться перед main, все, что нужно, это пара break s:

foreach ($objects as $object): 
    if($object->title == 'second') { 
        echo '<span></span>';
        break;
    } elseif($object->title == 'main') { 
        echo '<div></div>';
        break;
    }
endforeach;
1 голос
/ 09 января 2012

Foreach перебирает все записи в этом массиве, поэтому вам нужно разбить его после первого совпадения, вы можете использовать break; после этого echo, чтобы выпрыгнуть из foreach

...