2017-03-02 47 views
0

我有一個默認情況下按字母順序排列的數組。PHP數組排序和跳過下劃線

Array 
(
    [0] => C:\xampp\htdocs\_luke 
    [1] => C:\xampp\htdocs\_zod 
    [2] => C:\xampp\htdocs\jess 
    [3] => C:\xampp\htdocs\peter 
) 

我的代碼將是這樣的:

foreach($array as $item) { 
    echo $item; 
} 
  • 我如何排序並跳過_人物?
  • 我不能刪除_,因爲我在循環中時仍然需要它。
  • 我不在乎保持關鍵的數字。無論如何,我正在做一個foreach循環。

我要找的結果是這樣的:

Array 
(
    [0] => C:\xampp\htdocs\jess 
    [1] => C:\xampp\htdocs\_luke 
    [2] => C:\xampp\htdocs\peter 
    [3] => C:\xampp\htdocs\_zod 
) 
+0

使用'usort'進行適當的比較,例如, 'ltrim($ a,'_')<=> ltrim($ b,'_')'。 – deceze

+0

而不是整數鍵,按照文件夾名稱設置鍵值,不帶bar和ksort(); –

回答

3

你在找什麼是usort一個廚房的回調函數來進行比較。

使用這樣的:

usort($array, function($elemA, $elemB) { 
    return strcmp(str_replace("_", "", $elemA), str_replace("_", "", $elemB)); 
}); 

這將使用strcmp,但忽略了下劃線 「_」 你的元素進行比較。

+1

請注意,這會忽略整個字符串中的* all *下劃線,而不僅僅是前導字符。 – deceze

+0

它沒有忽略_all_下劃線,因爲OP沒有提到需要的特殊解析。 – Kleskowy

+1

@Kleskowy我把你的答案設定爲可接受的答案。我也加入了我自己的看法。這有點「微不足道」,因爲我使用一些CMS輔助功能來完成它。然而它是基於你的代碼,然後改變了很多。謝謝! –

0
function cmp($a, $b) 
{ 
    $a = preg_replace('/\_/', '', $a); 
    $b = preg_replace('/\_/', '', $b); 

    return strcmp($a, $b); 
} 

$array = Array 
(
    'C:\xampp\htdocs\_luke', 
    'C:\xampp\htdocs\_zod', 
    'C:\xampp\htdocs\jess', 
    'C:\xampp\htdocs\peter' 
); 

usort($array, "cmp"); 
print_r($array); 

使用助手方法「均衡」文本。

0

我已經設置了另一個接受的答案,但這是我結束了。它可以給其他人提示如何處理第一個下劃線。

usort($folders, function($a, $b) { 
    return strcmp(
     ltrim(basename($a), '_'), 
     ltrim(basename($b), '_') 
    ); 
}); 
+0

不確定那些幫助函數加上'ltrim($ a,'_')',但是好吧...... :) – deceze

+0

@deceze看起來你住在Stack Overflow上。 :)無論如何,您的解決方案一如既往,而且現在我的代碼在沒有Kirby CMS依賴的情況下更短。謝謝! –

+1

代碼編譯時遇到很多短暫停機時間;;) – deceze