2016-09-18 11 views
0

アンダースコアを含む文字列を_の配列の下に移動しようとしています。私はusort()が最も効率的な方法でこれを行う方法が最善の方法だと思っています。のは、私の配列が'1','34_1','35_1','36_1','7','41_4','38_5','5','41_5','44_5','45_5'配列を並べ替え、アンダースコアを含むすべての文字列を下に移動します。

usort(['1','34_1','35_1','36_1','7','41_4','38_5','5','41_5','44_5','45_5'], function(){...}); 

UPDATEであるとしましょう:私はそれを行う方法を見つけたと思う:

$myarray = ['1','34_1','35_1','36_1','7','41_4','38_5','5','41_5','44_5','45_5']; 

function sortem($myarray) { 
    foreach ($myarray as $index=>$item) 
    { 
     if (preg_match('/^_+$/', $item)) 
     { 
      unset($myarray[$index]); 
      $myarray[$index] = $item;    
     } 
    } 
} 
usort($myarray, "sortem"); 
$tagsuri = array_reverse($tagsuri); 

は、より良い方法はありますか?

+0

あなたの例外出力は何ですか? –

+0

私は思考を更新しました。私はアンダースコアを含む文字列を最後にしたい、順序は私には関係ありません。出力例:['8'、 '7'、 '41_7'、 '55_8'、 '32_7'] –

答えて

0

私はあなたがusort()への道を見つけることができる確信しているが、これを行うための簡単な方法は、ちょうどそれらをバック組み合わせ、その後、二つに配列を分割するために、次のようになります。

<?php 
$myarray = array('1','34_1','35_1','36_1','7','41_4','38_5','5','41_5','44_5','45_5'); 

foreach($myarray as $value) { 
    # Put all numbers into one array, underscored into a second 
    if(strpos($value,'_') !== false) 
     $strArr[] = $value; 
    else 
     $numArr[] = $value; 
} 
# Sort both arrays 
# You'll probably want to do checks to see that they are not empty first 
asort($strArr); 
asort($numArr); 
# Combine arrays 
print_r(array_merge($numArr,$strArr)); 

はあなたを与える:

Array 
(
    [0] => 1 
    [1] => 5 
    [2] => 7 
    [3] => 34_1 
    [4] => 35_1 
    [5] => 36_1 
    [6] => 38_5 
    [7] => 41_4 
    [8] => 41_5 
    [9] => 44_5 
    [10] => 45_5 
) 
+0

ありがとうございます、はい、空のエントリを削除する前に配列のarray_filter()を実行します。 –

+0

これに1つの問題が見つかりました。配列に、すべてがアンダースコアを持つか持っていない値を持つ場合は、機能しません。例 '' 1 '、' 2 '、' 3 ''、 '1_34'、 '2_45'、 '33_1'' –

+0

これは私が小切手 – Rasclatt

関連する問題