まず解決し、説明...
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()
返すAあなたが言ったように真偽の応答。配列の反復関数を使用し、同じ行に直接結果を宣言(または単純にエコー)する場合は、array_map()
を使用できます。
あなた$fortuneArray
は異なる区切り文字を持っている、explode()
等、trim()
、intval()
を使用して、余分なステップを実行せずに(一貫トリミングされた番号を返すために頼ることができない、あなたの入力区切り文字を標準化することができない限り、あなたが必要なを取る必要がありますので私はあなたのサンプル入力を変更したくないので、preg_match_all()
を使用しました。値を抽出するために単一の関数を使いたいと思っていました。
比較値が$fortuneArray
文字列のいずれかを満たしている場合は、max()
を使用して目的の文字列を返すことができます(他のすべてのva lueはnullを返します。 $mapped
をすべての条件付き結果を含む配列にする場合は、からmax()
関数を削除してください。
array_map
の3部条件文は、最初にパイプ文字列から値を抽出し、生成された一致の配列を2番目と3番目の条件で使用します。条件式のいずれかが偽の結果を返すとすぐに、戻り値はnull
になります。これにより、クリーンで効率的なものになります。
は、あなたのケースのために
array_walk()
オーバー
array_map()
を使用することの利点を表現するためには、あなた
でし結果変数を宣言する必要性を回避し、すぐにこのような単一の(まだ恐ろしく長い)ラインでの予選値をエコー。
コード:
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年? –