2011-01-26 16 views
0

誰でも手伝いたいと思っています。PHPの2次元配列を並べ替える

私は、例えば次のようないくつかのジョブ項目を持つ2次元配列を持っています。

$portfolioItems [$i] = array('job' => $extra_job->field_value, 
     'mediaType' => $media_type->field_value, 'default' => $default->field_value 
    ); 

私はソートしようとしている要素を表示するために配列を単純化しました。

基本的に、このリストは、最終的には、サムネイル/データで私が使用しているjfredcarouselを移入など

このすべてが正常に動作しますが、私は何をしたいのですが、次のように特定の順序を持​​っています。

メディアの種類に 'hero'という文字列が含まれている場合(1つのインスタンスになります)、この権利を前面に押します。

次に、次のアイテムは、アイテムの「デフォルト」セットとして識別されたいくつかのジョブアイテムである必要があります。おそらく、ジョブ番号を「デフォルト」として識別し、「ヒーロー」プロセスのようにチェックするフラグをどこかに設定します。

これは「ヒーロー」アイテムとなり、ジョブ番号アイテムは「デフォルト」と定義され、残りはそれ以降は順番に削除されます(ジョブ番号でアイテムを並べ替えています)。

元の2次元配列をソートするにはどうすればよいですか?私はshift/unshiftなどを見ていましたが、私が望んでいたものを達成できませんでした - 今は配列を複製して、これらの条件を1つずつチェックして新しい配列が正しいように見ています。古い配列を破壊します。

任意の考えは

答えて

0

多分そのような何か? :)

$finalItems = array(); 

for($i = 0; i < count($portfolioItems); $i++){ 
     if($portfolioItems[$i]['media_type'] == 'hero'){ 
     reindex($finalItems, 0); 
     $finalItems[0] = $portfolioItems[$i]; 
     } 
     else if($portfolioItems[$i]['default'] == true){ 
     reindex($finalItems, 1); 
     $finalItems[1] = $portfolioItems[$i]; 
     } 

     else { 
      if($i != 0 && $i != 1){ 
        reindex($finalItems, $i); 
        $finalItems[$i] = $portfolioItems[$i]; 
      } 
     } 
} 

function reindex(&$arr, $modifiedPosition){ 

for($i = 0; $i < count($arr); $i++){ 
    if($modifiedPosition <= $i){ 
    $arr[$i+1] = $arr[$i]; 

    if($i == $modifiedPosition){ 
    unset($arr[$i]); 
    } 

    } 

} 

} 
+0

ありがとう、私はそれを行こう。 – frazzle

+0

それをテストしていない、ちょうどそれがうまくいけば、それを修正しようとします。 – usoban

+0

さて、私はそれを更新しました、以前は明らかにうまくいきませんでした。 – usoban

2

使用uasort

感謝を高く評価し、必要なこれらのルールを体現し、独自の比較関数を記述します。

のような何か:

function cmp($a, $b) { 
    if (strpos($a['mediaType'], 'hero') !== false && strpos($b['mediaType'], 'hero') === false) { 
     return 1; 
    } else if (strpos($a['mediaType'], 'hero') === false && strpos($b['mediaType'], 'hero') !== false) { 
     return -1; 
    } else if ($a['default'] == 1 && $b['default'] != 1) { 
     return 1; 
    } else if ($a['default'] != 1 && $b['default'] == 1) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 

uasort($portfolioItems, 'cmp'); 
+0

乾杯 - ただ、質問uasortは、インデックス数を維持しているが、私はこの配列を通じてforeachの際に、後からXMLファイルに固執する - それが戻ってインデックス順でもないのだろうか? – frazzle

+2

いいえ、uasortの目的は配列をソート(順序を変更)することです。必ずしも同じではないため、インデックスと注文を混同しないでください。インデックスの関連付けを維持する必要がない場合は、代わりに 'usort'を使用することができます。 –

+0

Danに感謝します。私はこれが2次元配列なので、配列全体のすべての要素に対してこの関数をforeachにスティックする必要があると言っていますか?例えば、uasort($ portfolioItems [$ count]、 'cmp'); – frazzle

関連する問題