2017-04-12 181 views
0

這裏嚴重卡住了:我必須比較字符串的前兩個值並返回字符串的第三部分。 例如,如果(80 96)return 1000.目前,因爲我使用array_walk,我只是得到真或假。除了做多個foreach之外,還有其他的解決方法嗎?array_walk返回true或false。需要返回一個變量

$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 code demo

<?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 ]) 

它將返回布爾值即真或假。

如果您想實現類似於從中獲取值的功能,您可以通過地址傳遞變量,因此相對值將被存儲在該變量中。

這裏是例子,

$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()返回正如你所說的那樣,真/假反應。如果要使用數組迭代函數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