PHP 中数组内使用的具有多个条件的三元运算符
Ternary Operator with multiple conditions used inside an Array in PHP
如果 An API 给出以下响应,考虑到 array[0] 和 array[1] 有时可以是值 MX,有时可以是值 AR:
["published_sites"]=>
array(3) {
[0]=>
object(stdClass)#1565 (5) {
["site"]=>
string(2) "MX"
["sale_price"]=>
int(956)
["status"]=>
string(6) "active"
["item_id"]=>
string(12) "MLM724808"
["url"]=>
string(108) "http://articulo.mercadolibre.com.mx/MLM-722808-apple-apple-watch-series-4-gps-cellular-44mm-space-bla-_JM"
}
[1]=>
object(stdClass)#1569 (3) {
["site"]=>
string(2) "AR"
["sale_price"]=>
int(956)
["status"]=>
string(6) "active"
["item_id"]=>
string(12) "MLM724808"
["url"]=>
string(108) "http://articulo.mercadolibre.com.ar/MLM-722808-apple-apple-watch-series-4-gps-cellular-44mm-space-bla-_JM"
}
为了在数据库中保存,您创建了一个包含以下字段的数组,用于为 AR 和 MX 分配值:
Channels::updateOrCreate(['mpid' => $response->mpid], [
'mpid' => $response->mpid,
'published_site_ar_item_id' => $assign item_id for AR, eg: $item_ar_assign
'published_site_mx_item_id' => $assign item_id for MX,
考虑到 Array only can use ternary operator for conditionals 我尝试使用以下结构,但对多个条件使用 Or 无效。 ->
item_ar_assign = ($response->published_sites['0']->site == 'AR' ?: $response->published_sites['0']->item_id)
||($response->published_sites['1']->site == 'AR' ?: $response->published_sites['1']->item_id)
||($response->published_sites['2']->site == 'AR' ? : $response->published_sites['2']->item_id)
这种三元运算符+多个条件的方法是否可以用于数组?
(注意:我读过像 这样的重复项,但我不认为是相同的方法。)
首先,我不确定您为什么认为这里的数组存在特殊问题。让我们替换变量,以便我们可以看到代码的重要部分:
$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 的
||
运算符总是 returns 布尔值 - 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
}
}
如果 An API 给出以下响应,考虑到 array[0] 和 array[1] 有时可以是值 MX,有时可以是值 AR:
["published_sites"]=>
array(3) {
[0]=>
object(stdClass)#1565 (5) {
["site"]=>
string(2) "MX"
["sale_price"]=>
int(956)
["status"]=>
string(6) "active"
["item_id"]=>
string(12) "MLM724808"
["url"]=>
string(108) "http://articulo.mercadolibre.com.mx/MLM-722808-apple-apple-watch-series-4-gps-cellular-44mm-space-bla-_JM"
}
[1]=>
object(stdClass)#1569 (3) {
["site"]=>
string(2) "AR"
["sale_price"]=>
int(956)
["status"]=>
string(6) "active"
["item_id"]=>
string(12) "MLM724808"
["url"]=>
string(108) "http://articulo.mercadolibre.com.ar/MLM-722808-apple-apple-watch-series-4-gps-cellular-44mm-space-bla-_JM"
}
为了在数据库中保存,您创建了一个包含以下字段的数组,用于为 AR 和 MX 分配值:
Channels::updateOrCreate(['mpid' => $response->mpid], [
'mpid' => $response->mpid,
'published_site_ar_item_id' => $assign item_id for AR, eg: $item_ar_assign
'published_site_mx_item_id' => $assign item_id for MX,
考虑到 Array only can use ternary operator for conditionals 我尝试使用以下结构,但对多个条件使用 Or 无效。 ->
item_ar_assign = ($response->published_sites['0']->site == 'AR' ?: $response->published_sites['0']->item_id)
||($response->published_sites['1']->site == 'AR' ?: $response->published_sites['1']->item_id)
||($response->published_sites['2']->site == 'AR' ? : $response->published_sites['2']->item_id)
这种三元运算符+多个条件的方法是否可以用于数组?
(注意:我读过像
首先,我不确定您为什么认为这里的数组存在特殊问题。让我们替换变量,以便我们可以看到代码的重要部分:
$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 的
||
运算符总是 returns 布尔值 -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
}
}