2016-09-14 12 views
0

混合文字列を含む並べ替えの配列に問題があります。混合文字列PHPを含む配列を並べ替える

文字列に数字と文字の両方が含まれています。私は文字列に含まれる整数値で配列をソートしたい。

ソート順はアルファベット順にする必要があります。

Result配列とMy Required配列を見てください。私は配列をソートするために使用しています

私の現在のアレイ

Array 
 
(
 
    [0] => Array 
 
     (
 
      [title] => B2(14) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [1] => Array 
 
     (
 
      [title] => G3(14) consectetur adipiscing elit 
 
     ) 
 

 
    [2] => Array 
 
     (
 
      [title] => A3(14) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [3] => Array 
 
     (
 
      [title] => B13(16) consectetur adipiscing elit 
 
     ) 
 

 
    [4] => Array 
 
     (
 
      [title] => A13(16) consectetur adipiscing elit 
 
     ) 
 

 
    [5] => Array 
 
     (
 
      [title] => A13(15) consectetur adipiscing elit 
 
     ) 
 

 
    [6] => Array 
 
     (
 
      [title] => D13(15) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [7] => Array 
 
     (
 
      [title] => A13(13) consectetur adipiscing elit 
 
     ) 
 

 
)

機能は

uasort($array,'my_post_sort'); 
 

 
function my_post_sort($a,$b) { 
 

 
    $akey = $a['title']; 
 

 
    if (preg_match_all('/\d+/',$akey,$matches)) { 
 

 
     $akey = sprintf('%010d ',$matches[0][1]); 
 
    } 
 
    $bkey = $b['title']; 
 
    if (preg_match_all('/\d+/',$bkey,$matches)) { 
 
     $bkey = sprintf('%010d ',$matches[0][1]); 
 
    } 
 

 
    if ($akey == $bkey) { 
 

 
     return 0; 
 
    } 
 

 
    return ($bkey > $akey) ? 1 : -1; 
 
}

その結果は以下の通りです私は、コードの上に使用して取得していますが

Array 
 
(
 
    [3] => Array 
 
     (
 
      [title] => B13(16) consectetur adipiscing elit 
 
     ) 
 

 
    [4] => Array 
 
     (
 
      [title] => A13(16) consectetur adipiscing elit 
 
     ) 
 

 
    [5] => Array 
 
     (
 
      [title] => A13(15) consectetur adipiscing elit 
 
     ) 
 

 
    [6] => Array 
 
     (
 
      [title] => D13(15) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [0] => Array 
 
     (
 
      [title] => B2(14) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [1] => Array 
 
     (
 
      [title] => G3(14) consectetur adipiscing elit 
 
     ) 
 

 
    [2] => Array 
 
     (
 
      [title] => A3(14) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [7] => Array 
 
     (
 
      [title] => A13(13) consectetur adipiscing elit 
 
     ) 
 

 
)

以下のようである何私の要件であることは以下の通りである

Array 
 
(
 
    [0] => Array 
 
     (
 
      [title] => A3(14) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [1] => Array 
 
     (
 
      [title] => B2(14) consectetur adipiscing elit 
 
     ) 
 

 
    [2] => Array 
 
     (
 
      [title] => G3(14) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [3] => Array 
 
     (
 
      [title] => A13(16) consectetur adipiscing elit 
 
     ) 
 

 
    [4] => Array 
 
     (
 
      [title] => B13(16) consectetur adipiscing elit 
 
     ) 
 

 
    [5] => Array 
 
     (
 
      [title] => A13(15) consectetur adipiscing elit 
 
     ) 
 

 
    [6] => Array 
 
     (
 
      [title] => D13(15) Lorem ipsum dolor sit amet 
 
     ) 
 

 
    [7] => Array 
 
     (
 
      [title] => A13(13) consectetur adipiscing elit 
 
     ) 
 

 
)

Please see screenshot

+0

左括弧の前の文字だけをソートしていますか?そうであれば、整数が同じであれば、2番目のソート条件は何ですか? – Chris

+0

必要な並べ替えはローカルでのみソートされています。このループを一般的なループで解決することはできません。私は3つのループに賭ける:(1)文字列の分割/分解とグループ分け(顺序の順)、(2)(1)で作成したサブグループと再構成のための別のもの(3) ))。 – shudder

答えて

0

あなたが求めているものの私の最高の解釈から、手紙の直後の数字(括弧内の数字ではない)でソートすれば、手紙、あなたの「希望の結果」は最初の2つのエントリーを間違った方法で返します。

しかし、これを試してみると、それはあなたの要件のために動作するかどうか(最後の手段として括弧内の数でもソートI)を参照してください。

Array 
(
    [0] => Array 
     (
      [title] => B2(14) Lorem ipsum dolor sit amet 
     ) 

    [2] => Array 
     (
      [title] => A3(14) Lorem ipsum dolor sit amet 
     ) 

    [1] => Array 
     (
      [title] => G3(14) consectetur adipiscing elit 
     ) 

    [7] => Array 
     (
      [title] => A13(13) consectetur adipiscing elit 
     ) 

    [5] => Array 
     (
      [title] => A13(15) consectetur adipiscing elit 
     ) 

    [4] => Array 
     (
      [title] => A13(16) consectetur adipiscing elit 
     ) 

    [3] => Array 
     (
      [title] => B13(16) consectetur adipiscing elit 
     ) 

    [6] => Array 
     (
      [title] => D13(15) Lorem ipsum dolor sit amet 
     ) 

) 

けれども:中

$a = [ 
    ['title' => 'B2(14) Lorem ipsum dolor sit amet'], 
    ['title' => 'G3(14) consectetur adipiscing elit'], 
    ['title' => 'A3(14) Lorem ipsum dolor sit amet'], 
    ['title' => 'B13(16) consectetur adipiscing elit'], 
    ['title' => 'A13(16) consectetur adipiscing elit'], 
    ['title' => 'A13(15) consectetur adipiscing elit'], 
    ['title' => 'D13(15) Lorem ipsum dolor sit amet'], 
    ['title' => 'A13(13) consectetur adipiscing elit'], 
]; 

uasort($a, function($a, $b) { 
    $partsA = $partsB = []; 
    preg_match('!^([A-Z]+)(\d+)\((\d+)\) !i', $a['title'], $partsA); 
    preg_match('!^([A-Z]+)(\d+)\((\d+)\) !i', $b['title'], $partsB); 
    foreach ([2, 1, 3] as $i) { 
     if ($partsA[$i] != $partsB[$i]) { 
      return strnatcasecmp($partsA[$i], $partsB[$i]); 
     } 
    } 
    return 0; 
}); 

結果元の投稿を再読み込みするための要件を誤解している可能性があります。あなたは「アルファベット順」と言って、文字列の先頭に手紙を置いた。もちろん、括弧の後に続くテキストを意味するかもしれません。したがって、これはあなたのニーズに最も適していないかもしれませんが、助けてくれるかもしれません

関連する問題