2017-04-12 8 views
0

ここでひどく詰まっています:文字列の最初の2つの値を比較し、文字列の3番目の部分を返す必要があります。 if(80 96)1000を返します。現在、私はarray_walkを使用しているため、私は真または偽になっています。これとは別に、複数のforeachを実行する以外の方法はありますか? array_walkはtrueまたはfalseを返します。代わりに変数を返す必要があります

PHP code demo

$fortuneArray = ['1'=> '80 | 96 | 1000','2'=>'3648|4000|100']; 
$valueToBeCompared = ['88']; 

$val =array_walk($fortuneArray,'test_print',$valueToBeCompared); 

function test_print($fortuneArray,$valueToBeCompared) 
{ 
    $compare = explode('|',$fortuneArray); 

    if($compare[0] < $valueToBeCompared && $compare[1] > $valueToBeCompared){ 

       return $compare[2]; 
      } 
     } 
+0

$比較 'の期待される結果がどうあるべきか[2];' 1000年? –

答えて

1
<?php 

$fortuneArray = ['1' => '80 | 96 | 1000', '2' => '3648|4000|100']; 
$valueToBeCompared = ['88']; 
//1. here you are passing an array so while comparison use its zero index 
//2. This is the third parameter passed in callback not second 
$result=""; 
$val = array_walk(
     $fortuneArray, 
     function ($fortuneArray, $key,$valueToBeCompared) use (&$result) 
     { 
      $compare = explode('|', $fortuneArray); 
      $compare=array_map("trim",$compare);//each value should be trimmed from spaces 
      if ($compare[0] < $valueToBeCompared[0] && $compare[1] > $valueToBeCompared[0]) 
      { 
       $result = $compare[2]; 
      } 
     }, $valueToBeCompared); 
echo $result; 

出力:構文によって 1000

0

bool array_walk (array &$array , callable $callback [, mixed $userdata = NULL ]) 

それはすなわち、trueまたはfalseのブール値を返します。

値を取得するようなことを達成したい場合は、アドレスで変数を渡すことができるので、相対値がその変数に格納されます。ここで

例があり、

$fortuneArray  = ['1' => '80 | 96 | 1000', '2' => '3648|4000|100']; 
$valueToBeCompared = 88; 
$result = ''; 
array_walk($fortuneArray, function ($fortuneArray, $key, $valueToBeCompared) use (&$result) 
{ 
    $compare = explode(' | ', $fortuneArray); 
    if ($compare[0] < $valueToBeCompared && $compare[1] > $valueToBeCompared) { 
     $result = $compare[2]; 
    } 
}, $valueToBeCompared); 
echo $result; 

私は$resultはあなたが必要とするものだと思います。

デモlink

0

まず解決し、説明...

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 
関連する問題