Во-первых, я не уверен, почему вы думаете, что здесь есть особая проблема с массивами.Давайте заменим переменные, чтобы мы могли видеть важную часть кода:
$site0 = $response->published_sites['0']->site;
$id0 = $response->published_sites['0']->item_id;
$site1 = $response->published_sites['1']->site;
$id1 = $response->published_sites['1']->item_id;
$site2 = $response->published_sites['2']->site;
$id2 = $response->published_sites['2']->item_id;
$item_ar_assign =
($site0 == 'AR' ?: $id0)
|| ($site1 == 'AR' ?: $id1)
|| ($site2 == 'AR' ? : $id2);
Причина, по которой это не сработает, не имеет ничего общего с массивами, а потому что вы использовали неправильные операторы:
- Оператор PHP
||
всегда возвращает логическое значение - true
или false
, независимо от того, на какие значения он смотрит. - Форма
$a ?: $b
означает "$a
, если онаили $b
если нет ".В этом случае $site0 == 'AR' ?: $id0
будет означать «true
, если $site0
равно 'AR'
, или значение $id0
, если нет»
То, что я пытаюсь сделать, этоВложите полную форму троичного оператора: $test ? $valueIfTrue : $valueIfFalse
.
Обратите внимание, что ассоциативность немного странная, поэтому вам нужно аккуратно использовать скобки.Я думаю, что это должно сработать:
$item_ar_assign =
($site0 == 'AR') ? $id0
: (
$site1 == 'AR' ? $id1
: (
$site2 == 'AR' ? : $id2
)
);
Как только вы вернете свои полные переменные, вероятно, они будут выглядеть лучше с полными if
операторами.
if ($response->published_sites[0]->site == 'AR' ) {
$item_ar_assign = $response->published_sites[0]->item_id;
}
elseif ($response->published_sites[1]->site == 'AR' ) {
$item_ar_assign = $response->published_sites[1]->item_id;
}
elseif ($response->published_sites[2]->site == 'AR' ) {
$item_ar_assign = $response->published_sites[2]->item_id;
}
Однако вместоскопировав и вставив условие, вы можете поместить его в цикл:
foreach ( [0, 1, 2] as $site_number ) {
if ($response->published_sites[$site_number]->site == 'AR' ) {
$item_ar_assign = $response->published_sites[$site_number]->item_id;
break; // stop at first match
}
}
или даже проще:
foreach ( $response->published_sites as $published_site ) {
if ($published_site->site == 'AR' ) {
$item_ar_assign = $published_site->item_id;
break; // stop at first match
}
}