在表單中有動態新增的欄位陣列
為了判斷資料傳送時是否有異常
會檢查欄位陣列數量是否一致
之前的寫法是
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的等於判斷式簡化??
或是==的簡化有別的寫法??
我有點久沒寫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
建議你去看運算符優先順序這或許能解答你的疑惑。第三個之所以能執行是因為 '>'、'<'優先順序大於'=',至於第二個因為都是'='所以他無法判斷是要從哪邊開始,你可以加入小括號來進行運算
不用去想奇怪的寫法,只要將if判斷條件分成多行,就可以解決程式碼拉很長的問題了。
if (
count($aryA) != count($aryB) ||
count($aryA) != count($aryC) ||
count($aryA) != count($aryD) ||
count($aryA) != count($aryE)
) {
// 異常處理
}
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 ;
抱歉,這個難度太高,沒看懂
不知道這有沒有比較好理解 :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