foreachリストアイテムの逆順


83

このコードのリストアイテムの順序を逆にします。基本的に、それは最も古いものから最近のものへの一連の年であり、私はその出力を逆にしようとしています。

<?php
    $j=1;     
    foreach ( $skills_nav as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
    }
?>  

回答:


178

後ろ向きに歩く

純粋なPHPソリューションを探している場合は、リストを逆方向に数えて、前後にアクセスすることもできます。

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

$index = count($accounts);

while($index) {
  echo sprintf("<li>%s</li>", $accounts[--$index]);
}

上記$indexは要素の総数に設定され、次にそれらにバックツーフロントでアクセスを開始し、次の反復のインデックス値を減らします。

配列を逆にする

このarray_reverse関数を利用して配列の値を反転し、逆の順序でそれらにアクセスできるようにすることもできます。

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

foreach ( array_reverse($accounts) as $account ) {
  echo sprintf("<li>%s</li>", $account);
}

2
@Slawek配列がすでに順序付けられている場合、逆方向にカウントするよりも逆方向のが必ずしも優れているのはなぜですか?
サンプソン2012年

1
完璧です、array_reverseは機能しました!ジョナサンと他のみんなに感謝します。
blkedy 2012年

4
@ JonathanSampson-ループで使用する前に配列を逆にすると、将来簡単に変更できるためです。ループロジックをデータにバインドする場合、順序を変更すると、ループも強制的に変更されます。
Slawek 2012年

1
@Slawekフォローするかどうかわかりません。配列を逆方向にカウントすることは一般的な方法であり、実際には配列を変更しないため、将来配列を処理するときに注意する必要はありません。
サンプソン2012年

1
@Slawek私はそこで意見の相違はありません。ユーザーが何らかのMVCパターンに従っている兆候は見られないと思いました。確かに、コントローラーまたはモデルがある場合は、多くの場合、そこで配列を並べ替える方が賢明かもしれません。
サンプソン2012年


20

array_reverse()ソース配列は変更しませんが、新しい配列を返します。(を参照してくださいarray_reverse()。)したがって、最初に新しい配列を格納するか、forループの宣言内で関数を使用する必要があります。

<?php 
    $input = array('a', 'b', 'c');
    foreach (array_reverse($input) as $value) {
        echo $value."\n";
    }
?>

出力は次のようになります。

c
b
a

したがって、OPにアドレス指定するには、コードは次のようになります。

<?php
    $j=1;     
    foreach ( array_reverse($skills_nav) as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
}

最後に、は$j、の逆方向のウォークを取得するための最初の試行で使用されたカウンターか$skills_nav$skills_nav配列をカウントする方法のいずれかであると推測します。前者の場合は、正しい解決策が得られたので削除する必要があります。後者の場合、ループの外側で。に置き換えることができます$j = count($skills_nav)


7

アレイ(またはその一時コピー)を破棄してもかまわない場合は、次のことができます。

$stack = array("orange", "banana", "apple", "raspberry");

while ($fruit = array_pop($stack)){
    echo $fruit . "\n<br>"; 
}

生成:

raspberry 
apple 
banana 
orange 

このソリューションは、インデックスをいじるよりも読みやすく、インデックス処理の間違いを引き起こす可能性は低いと思いますが、最初に配列の一時的なコピーを作成する必要がある場合、コードの実行に少し時間がかかる可能性があります。 。インデックスをいじるのは速くなる可能性が高く、次のように実際にインデックスを参照する必要がある場合にも役立ちます。

$stack = array("orange", "banana", "apple", "raspberry");
$index = count($stack) - 1;
while($index > -1){
    echo $stack[$index] ." is in position ". $index . "\n<br>";
    $index--;
} 

しかし、ご覧のとおり、インデックスには十分注意する必要があります...


1
array_popアプローチはより3倍遅いarray_reverseアプローチ:3v4l.org/3jaTT
フィネス

4

インデックス付き配列(連想または多次元ではない)を逆にする必要があると仮定すると、単純なforループで十分です。

$fruits = ['bananas', 'apples', 'pears'];
for($i = count($fruits)-1; $i >= 0; $i--) {
    echo $fruits[$i] . '<br>';
} 

3

あなたは使用することができますusort独自のソート・ルールを作成する機能を


1

配列がSQLクエリを介して入力されている場合は、MySQLで結果を逆にすることを検討してください。

SELECT * FROM model_input order by creation_date desc

-1
<?php
    $j=1; 


      array_reverse($skills_nav);   


    foreach ( $skills_nav as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
    }
?> 

1
array_reverse()はソース配列を変更しませんが、新しい配列を返します。
クラウディオシルバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.