我有這個字串
$s = "red2 blue5 black4 green1 gold3";
我需要按號碼訂購,但可以顯示號碼。數字總是出現在單詞的末尾。結果應該是這樣的:
$s = "green red gold black blue";
謝謝!
uj5u.com熱心網友回復:
它是否始終遵循這種模式 - 以空格分隔?
我會這樣分解問題:
我首先將字串決議為一個陣列,其中鍵是數字,值是單詞。您可以通過結合使用
preg_match_all和array_combine然后你可以使用
ksortorder 按我們在上一步中設定的鍵進行排序。最后,如果您希望將結果作為字串回傳,您可以
implode回傳結果陣列,再次用空格分隔。
一個示例解決方案可能是:
<?php
$x = "red2 blue5 black4 green1 gold3";
function sortNumberedWords(string $input) {
preg_match_all('/([a-zA-Z] )([0-9] )/', $input, $splitResults);
$combined = array_combine($splitResults[2], $splitResults[1]);
ksort($combined);
return implode(' ', $combined);
}
echo sortNumberedStrings($x);
我在這里使用的正則運算式匹配兩個單獨的組(用括號表示):
- 第一組是任意長度的字串
a-z(或大寫)。值得注意的是,這僅適用于拉丁字母表;例如,它不會匹配 ?。 - 第二組匹配直接出現在該字串之后的任意長度的數字字串。
這些匹配的結果存盤在 中$splitResults,它將是一個包含 3 個元素的陣列:
[0]所有匹配項的組合串列。[1]第 1 組所有比賽的串列。[2]第 2 組所有比賽的串列。
然后我們使用array_combine將它們組合成一個單一的關聯陣列。我們希望第 2 組充當“鍵”,第 1 組充當“值”。
最后,我們按鍵排序,然后將其內爆回字串。
uj5u.com熱心網友回復:
$s = "red2 blue5 black4 green1 gold3";
$a=[];
preg_replace_callback('/[a-z0-9] /',function($m) use (&$a){
$a[(int)ltrim($m[0],'a..z')] = rtrim($m[0],'0..9');
},$s);
ksort($a);
print " Version A: ".implode(' ',$a);
$a=[];
foreach(explode(' ',$s) as $m){
$a[(int)ltrim($m,'a..z')] = rtrim($m,'0..9');
}
ksort($a);
print " Version B: ".implode(' ',$a);
preg_match_all("/([a-z0-9] )/",$s,$m);
foreach($m[1] as $i){
$a[(int)substr($i,-1,1)] = rtrim($i,'0..9');
}
ksort($a);
print " Version C: ".implode(' ',$a);
使用其中之一,但也嘗試了解這里發生了什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535260.html
標籤:PHP细绳数字
下一篇:如何將字串轉換為沒有空格的陣列
