2017-06-15 108 views
-1

我有數據PHP - 匹配與數組值的字符串的第一字符和返回鍵

0134234XXX 
0255234XXX 
0843324XXX 
080054XXXX 
001342343XX 
07800XXXXXX 
003342343XX 

的負荷和陣列:(密鑰=>纈氨酸)

[1] => [01] 
[2] => [001] 
[3] => [07] 
[4] => [0845] 

我想寫將返回匹配的第一個字符 例如導航鍵的功能:

$keyNumber = findkey('001342343XX'); 

$keyNumber = 2 
+2

*我想.. *然後告訴你已經嘗試過的東西。 – revo

+0

http://php.net/manual/en/function.array-search.php – mkaatman

+0

我試着寫點東西,但是......'0255234XXX'的預期結果是什麼?輸入數組是'array('01','001','07','0845')'? –

回答

0

我不認爲OP希望匿名函數,因爲它是likley的數組元素被重用。

這是一個稍微低效的revo方法版本,當搜索數組值也作爲另一個值的前導字符存在時,它將尋求最長匹配。 (Demo

$tin_foil_hat="on"; // <-- essential for this method ;) 

function findkey($haystack,$needles){ 
    $match=0; // "No Match"; 
    foreach($needles as $k=>$v){ 
     if(strpos($haystack,$v)===0){ 
      $match=$k; // overwrite any shorter previous matches 
     } 
    } 
    return $match; 
} 

$haystacks=['0134234XXX','0255234XXX','0843324XXX','080054XXXX','001342343XX','07800XXXXXX','003342343XX']; 
$haystacks[]='0110000XXX'; // for Wiktor 
$needles=[1=>'01',2=>'001',3=>'07',4=>'0845']; 
$needles[5]='011'; // for Wiktor 
// This assumes shorter string contained in a larger string will be ordered first in $needles array. 
// If no needles value is contained in another needles value, then revo's is the way to go (with early return). 

foreach($haystacks as $haystack){ 
    echo $haystack,' => ',findkey($haystack,$needles),"\n"; 
} 

輸出:

0134234XXX => 1 
0255234XXX => 0 
0843324XXX => 0 
080054XXXX => 0 
001342343XX => 2 
07800XXXXXX => 3 
003342343XX => 0 
0110000XXX => 5 
0

你不需要定期的電子Xpressions的位置:

$findKey = function($str) use ($values) { 
    foreach ($values as $k => $v) 
     if (strpos($str, $v) === 0) return $k; 
    return false; 
}; 

Live demo

+0

如果數組爲'$ values = ['01','011','0845','001'];'和字符串爲'0110000',它將不起作用。你的代碼會說'0',而它應該是'1',不是嗎? –

+0

你爲什麼認爲它應該是'1'? – revo

+1

@ChrisKerrison revo的方法是最短,最有效的方法來做到這一點(雖然你可能不想要一個匿名函數)。如果像Wiktor所說的那樣,有一個值表示另一個值的開始的可能性,那麼只要確保在針陣列中的較短值之前排序較長的值即可。 – mickmackusa

相關問題