[英]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語句並在其他數組中定義我們的條件和消息。 為了做到這一點,我們應該:
actionkey => actionvalue
的形式,例如: "loggedin" => 0
樣例代碼:
<?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。
例如,沒有and
和but
變體:
$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---
我不能保證這是正確的代碼。 但是我認為下面的代碼可以給您解決問題的想法
<?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.