0134234XXX
0255234XXX
0843324XXX
080054XXXX
001342343XX
07800XXXXXX
003342343XX
的負荷和陣列:(密鑰=>纈氨酸)
[1] => [01]
[2] => [001]
[3] => [07]
[4] => [0845]
我想寫將返回匹配的第一個字符 例如導航鍵的功能:
$keyNumber = findkey('001342343XX');
$keyNumber = 2
0134234XXX
0255234XXX
0843324XXX
080054XXXX
001342343XX
07800XXXXXX
003342343XX
的負荷和陣列:(密鑰=>纈氨酸)
[1] => [01]
[2] => [001]
[3] => [07]
[4] => [0845]
我想寫將返回匹配的第一個字符 例如導航鍵的功能:
$keyNumber = findkey('001342343XX');
$keyNumber = 2
我不認爲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
你不需要定期的電子Xpressions的位置:
$findKey = function($str) use ($values) {
foreach ($values as $k => $v)
if (strpos($str, $v) === 0) return $k;
return false;
};
如果數組爲'$ values = ['01','011','0845','001'];'和字符串爲'0110000',它將不起作用。你的代碼會說'0',而它應該是'1',不是嗎? –
你爲什麼認爲它應該是'1'? – revo
@ChrisKerrison revo的方法是最短,最有效的方法來做到這一點(雖然你可能不想要一個匿名函數)。如果像Wiktor所說的那樣,有一個值表示另一個值的開始的可能性,那麼只要確保在針陣列中的較短值之前排序較長的值即可。 – mickmackusa
*我想.. *然後告訴你已經嘗試過的東西。 – revo
http://php.net/manual/en/function.array-search.php – mkaatman
我試着寫點東西,但是......'0255234XXX'的預期結果是什麼?輸入數組是'array('01','001','07','0845')'? –