【问题标题】:Ternary Operator with multiple conditions used inside an Array in PHPPHP中数组内使用的具有多个条件的三元运算符
【发布时间】:2020-01-26 23:33:40
【问题描述】:

如果 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 只能对条件使用三元运算符,我尝试使用以下结构,但对多个条件使用 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)

这种三元运算符 + 多个条件的方法可以用于数组吗?

(注意:我为 Ternary operator with multiple conditions 之类的重复内容阅读了 SO,但我不认为是相同的方法。)

【问题讨论】:

  • 为什么你使用 === 作为第二个条件?
  • @Nawin 抱歉,拼写错误。解决了
  • 使用?:,它将返回左侧(您正在执行== 'AR'时是真还是假)或:之后的部分 - 你的意思是$response->published_sites['0']->site == 'AR' ? 'AR': $response->published_sites['0']->item_id
  • 嗨@NigelRen,我的想法是如果数组['0']返回true,则返回“$response->published_sites['0']->item_id”字符串,或者$response->如果数组 ['1'] 返回 true,则 published_sites['1']->item_id。我不知道这是否是正确的方法,但我需要在数组中添加一个条件,并且确定 if,elseif,else 不起作用。谢谢!。

标签: php laravel ternary-operator


【解决方案1】:

首先,我不确定您为什么认为这里的数组存在特殊问题。让我们替换变量,以便我们可以看到代码的重要部分:

$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 的 || 运算符始终返回布尔值 - truefalse,无论它查看什么值。
  • $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
    }
}

【讨论】:

  • 太棒了,所以我的问题在于尝试将所有内容放在一个句子中的方法,而不是首先更易读和易于理解的东西。我会试试的!
  • @s_h 请检查我的编辑以获得更整洁的版本:)
猜你喜欢
  • 2016-11-02
  • 2020-01-19
  • 1970-01-01
  • 2012-09-14
  • 2011-06-26
  • 2013-01-14
  • 2018-03-06
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多