首先解決,那麼說明...
OP的未修改輸入:
$fortuneArray=['1'=> '80 | 96 | 1000','2'=>'3648|4000|100'];
$valueToBeCompared=['88'];
代碼:
$mapped=max(array_map(function($v)use($valueToBeCompared){
return (preg_match_all('/\d+/',$v,$c) && $c[0][0]<$valueToBeCompared[0] && $c[0][1]>$valueToBeCompared[0])?$c[0][2]:null;
},$fortuneArray));
echo "Mapped = $mapped";
結果:
Mapped = 1000
array_walk()
返回正如你所說的那樣,真/假反應。如果要使用數組迭代函數AND直接在同一行中聲明結果(或簡單地將其回顯),則可以使用array_map()
。
因爲你$fortuneArray
有不同的分隔符,explode()
不能在始終如一地返回修剪號碼(而不需要利用trim()
,intval()
等除非你能標準化您輸入分隔符額外的步驟依賴,就需要採取必要的我已使用preg_match_all()
,因爲我不想修改您的示例輸入,並且我想使用單個函數來提取這些值。
如果您的比較值將僅爲滿足$fortuneArray
字符串之一,那麼你可以使用max()
來返回你想要的字符串(因爲所有其他的VA lues將返回null。如果你想$mapped
是一個包含所有條件結果的數組,那麼只需從array_map()
中刪除max()
函數。
array_map
裏面的3部分條件語句首先從管道字符串中提取值,然後在第二和第三個條件中使用生成的匹配數組。只要任何條件表達式返回錯誤結果,返回值將是null
- 這使得事情變得清潔和高效。
爲了表達使用array_map()
在array_walk()
爲你的情況的優勢,你能避免需要聲明一個結果變量,並立即迴響在這樣一個單一的(但可怕長)線的限定值。
代碼:
echo max(array_map(function($v)use($valueToBeCompared){return (preg_match_all('/\d+/',$v,$c) && $c[0][0]<$valueToBeCompared[0] && $c[0][1]>$valueToBeCompared[0])?$c[0][2]:null;},$fortuneArray));
輸出:
1000
應該是什麼的預期效果'$比較[2];'1000? –