簡體   English   中英

PHP檢查多個數組鍵值是否為真

[英]Php check multiple array key values for true or false

我有一個類似下面的數組。

在此處輸入圖片說明

我需要檢查action_keys的所有可能性以及true或false的值

嘗試過如下所示,但是需要知道是否有任何優化的方法可以在PHP中進行相同的操作

if( ($userInfoArray[0]['action_key'] =='loggedin' && $userInfoArray[0]['value']==1) && ($userInfoArray[1]['action_key'] =='optin' && $userInfoArray[1]['value']==1)    ){
        echo "LOGGEDIN and OPTIN---"; 
    }
    else if( ($userInfoArray[0]['action_key'] =='loggedin' && $userInfoArray[0]['value']==0) && ($userInfoArray[1]['action_key'] =='optin' && $userInfoArray[1]['value']==0)   ){
        echo "LOGOUT and OPTOUT---"; 
    }
    else if( ($userInfoArray[0]['action_key'] =='loggedin' && $userInfoArray[0]['value']==1) && ($userInfoArray[1]['action_key'] =='optin' && $userInfoArray[1]['value']==0)  ){
        echo "LOGGEDIN and Not Opted---"; 
    }
    else if( ($userInfoArray[0]['action_key'] =='loggedin' && $userInfoArray[0]['value']==0) && ($userInfoArray[1]['action_key'] =='optin' && $userInfoArray[1]['value']==1) ){
        echo "LOGGEDOUT but Opted---"; 
    }

問題是:

更新:

下面的0和1索引的數組鍵不斷變化,例如有時登錄[0] ['action_key'],有時選擇optin,並且值可能在0或1之間變化。

所以我正在嘗試條件下的所有組合。

像例子:

[0] ['action_key'] =登錄並且[0] ['value'] = 0和1 ['action_key'] = optin和1 ['value'] = 0

[0] ['action_key'] = optin和[0] ['value'] = 0以及1 ['action_key'] = loggedin和1 ['value'] = 1

[0] ['action_key'] =已登錄,[0] ['value'] = 1 ...

以及所有可能的組合。

我正在使用像:

    if( ($userInfoArray[0]['action_key'] =='loggedin' && $userInfoArray[0]['value']==1) && ($userInfoArray[1]['action_key'] =='optin' && $userInfoArray[1]['value'] ==0 )   )
    {}

    else if( ($userInfoArray[0]['action_key'] =='optin' && $userInfoArray[0]['value']==0) && ($userInfoArray[1]['action_key'] =='loggedin' && $userInfoArray[1]['value'] ==1 )   )
    {}

如果我像上面使用過的那樣嘗試上面的代碼,代碼不會太長。

最好的方法是避免if語句並在其他數組中定義我們的條件和消息。 為了做到這一點,我們應該:

  1. 將輸入數組映射為actionkey => actionvalue的形式,例如: "loggedin" => 0
  2. 在數組中指定我們的條件和滿足條件時應打印的消息
  3. 使用我們的輸入值過濾掉條件不正確的消息
  4. 打印剩下的消息

樣例代碼:

<?php

$input = [
    [
        'actionkey' => 'loggedin',
        'value' => 1
    ],
    [
        'actionkey' => 'optin',
        'value' => 0
    ]
];

//let's map it into actionkey => value
$actionValue = array_reduce(
    $input,
    function (array $out, $item) {
        $out[$item['actionkey']] = $item['value'];
        return $out;
    },
    []
);

$flow = [
    [
        "when" => [ "loggedin" => 1, "optin" => 1 ],
        "then" => "LOGGEDIN and OPTIN---"
    ],
    [
        "when" => [ "loggedin" => 0, "optin" => 0 ],
        "then" => "LOGOUT and OPTOUT---"
    ],
    [
        "when" => [ "loggedin" => 1, "optin" => 0 ],
        "then" => "LOGGEDIN and Not Opted---"
    ],
    [
        "when" => [ "loggedin" => 0, "optin" => 1 ],
        "then" => "LOGGEDOUT but Opted---"
    ],
];

$messagesToPrint =
    array_column(
        array_filter(
            $flow,
            function (array $item) use ($actionValue) {
                return empty(array_diff_assoc($item['when'], $actionValue));
            }
        ),
        "then"
    );

echo implode("\n", $messagesToPrint);

如果您希望所有可能性並且鍵可以在0到1之間變化,則可以使用array_column並將action_key用作第二個參數,以使該值成為鍵而不是0或1。

例如,沒有andbut變體:

$userInfoArray = array(
    0 => array(
        'action_key' => 'loggedin',
        'value' => 1
    ),
    1 => array(
        'action_key' => 'optin',
        'value' => 0
    )
);

$message = "";
$actionKeyToKey = array_column($userInfoArray, null, 'action_key');
$message .= $actionKeyToKey['loggedin']['value'] ? 'LOGGEDIN' : 'LOGOUT';
$message .= $actionKeyToKey['optin']['value'] ? ' OPTIN---' : ' Not Opted---';
echo $message;

這樣,您就可以構造您的消息。

演示版

如果您打算執行其他操作而不只是打印消息,則建議對已排序的輸入數組的選定元素使用開關。

sort($userInfoArray);
switch (array_column($userInfoArray, 'value', 'action_key')) {
    case ['loggedin' => 1, 'optin' => 1]:
        echo "LOGGEDIN and OPTIN---";
    break;

    case ['loggedin' => 0, 'optin' => 0]:
        echo "LOGOUT and OPTOUT---";
    break;

    case ['loggedin' => 1, 'optin' => 0]:
        echo "LOGGEDIN and Not Opted---"; 
    break;

    case ['loggedin' => 0, 'optin' => 1]:
        echo "LOGGEDOUT but Opted---";
    break;
}

這樣一來, optin可先和loggedin第二,它仍然會正確匹配。

$userInfoArray = [
    [
        'action_key' => 'optin',
        'value' => 0,
    ],
    [
        'action_key' => 'loggedin',
        'value' => 1,
    ],
];

輸出:

LOGGEDIN and Not Opted---

參見https://3v4l.org/8Yqfa

我不能保證這是正確的代碼。 但是我認為下面的代碼可以給您解決問題的想法

<?php 

        $array = array(

            0 => array(
                'actionkey' => 'loggedin',
                'value' => 1
            ),
            1 => array(
                'actionkey' => 'optin',
                'value' => 0
            )
        );

        foreach ($array as $key => $value){

            foreach ($value as $keyy => $data) {
                echo $keyy; 
                echo "<br>";
            }
            echo "<br>"; 
        }
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM