iT邦幫忙

1

PHP中多個等式判斷是否可以簡寫

  • 分享至 

  • xImage

在表單中有動態新增的欄位陣列
為了判斷資料傳送時是否有異常
會檢查欄位陣列數量是否一致
之前的寫法是

if(count($aryA) != count($aryB) || count($aryA) != count($aryC) || ....)

程式碼會拉得很長
想說是否有比較簡便的寫法
原本的想法是

!(count($aryA) == count($aryB) == count($aryC) == ....)?(...):(...);

會跳出錯誤訊息,原本以為PHP不允許這樣的寫法
但是改成下面的寫法卻能正常運行

echo !(count($aryA) > count($aryB) == count($aryC))?"YES":"NO";

所以PHP允許多個AND判斷式簡化,但不允許多個AND的等於判斷式簡化??
或是==的簡化有別的寫法??

未實驗先通靈: $a = !(count == count == count)? true:false; 這樣應該就會過了
主要是你沒有一個主要動作, 語法解析器在該行不知道你要做的到底是賦值還
是判斷式動作

純通靈!但你可以試試
ant1017 iT邦新手 2 級 ‧ 2022-10-28 09:44:41 檢舉
$a = count + count + count.....
if(a==0)
類似這樣
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4

我有點久沒寫php了。
但是…摻在一起做成……

不是!寫成一個函式,用多個參數傳入再比對不就好了?
概念:

function countEqual(...$args) : Bool {
	$counts = [];
	foreach($args as $value) {
		$counts[] = count($value);
	}
	return count(array_unique($counts)) == 1;
}
$a = [1, 2, 3, 4];
$b = [5, 6, 7, 8];
$c = [9, 10, 11];
echo countEqual($a, $b, $c) ? "True" : "False";

這樣會得到False
但如果這樣

$c = [9, 10, 11, 12];

就會得到True

shiaobin iT邦新手 4 級 ‧ 2022-10-28 15:59:16 檢舉

這方法不錯,用起來滿簡潔的耶。

迷路 iT邦新手 2 級 ‧ 2022-10-31 17:21:43 檢舉

原來函數的輸入參數還有這種用法
學到額外的新知識,感謝大大^^

0
peter4405
iT邦新手 5 級 ‧ 2022-10-28 10:08:41

建議你去看運算符優先順序這或許能解答你的疑惑。第三個之所以能執行是因為 '>'、'<'優先順序大於'=',至於第二個因為都是'='所以他無法判斷是要從哪邊開始,你可以加入小括號來進行運算

0
shiaobin
iT邦新手 4 級 ‧ 2022-10-28 11:36:06

不用去想奇怪的寫法,只要將if判斷條件分成多行,就可以解決程式碼拉很長的問題了。

if (
    count($aryA) != count($aryB) ||
    count($aryA) != count($aryC) ||
    count($aryA) != count($aryD) ||
    count($aryA) != count($aryE)
) {
    // 異常處理
}

0
whc
iT邦見習生 ‧ 2022-10-29 09:04:21

functional way

$base = count($a);

$compare = fn($item) => $base <=> count($item); 

$count = array_map($compare, [$b, $c, $d]);

count(array_filter($count, fn($item) => $item === 0)) === $base ;
迷路 iT邦新手 2 級 ‧ 2022-10-31 17:20:31 檢舉

抱歉,這個難度太高,沒看懂

JWei iT邦新手 4 級 ‧ 2023-02-01 18:38:09 檢舉

迷路

不知道這有沒有比較好理解 :D

$a = [3,4,1];
$b = [2,4,5];
$c = [3,7,2];
$d = [2,3];

list($count, $result) = array_reduce([$b, $c], function($base, $item) {
    $base[1] |= $base[0] <=> count($item);
    $base[0]  = count($item);

    return $base;
}, [count($a), 0]);

echo ($result === 0); // True


list($count, $result) = array_reduce([$b, $d], function($base, $item) {
    $base[1] |= $base[0] <=> count($item);
    $base[0]  = count($item);

    return $base;
}, [count($a), 0]);

echo ($result === 0); // False

我要發表回答

立即登入回答