foreach 목록 항목의 역순


88

이 코드의 목록 항목 순서를 바꾸고 싶습니다. 기본적으로 가장 오래된 것에서 최근으로가는 일련의 연도이며 나는 그 결과를 되돌리려 고 노력하고 있습니다.

<?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++;
    }
?>  

답변:


186

뒤로 걷기

순수 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 배열이 이미 주문 된 경우 역순으로 계산하는 것보다 반전이 필연적으로 더 나은 이유는 무엇입니까?
Sampson

1
완벽합니다. array_reverse가 작동했습니다! Jonathan과 다른 모든 사람들에게 감사합니다.
blkedy

4
@JonathanSampson-루프에서 사용하기 전에 배열을 반대로하면 나중에 간단히 변경할 수 있기 때문입니다. 루프 논리를 데이터와 바인딩 할 때 순서를 변경하면 루프도 강제로 변경됩니다.
Slawek

1
@Slawek 나는 내가 따르는 지 확실하지 않습니다. 배열을 통해 거꾸로 세는 것은 일반적인 관행이며 실제로 배열을 수정하지 않으므로 향후 배열을 처리 할 때주의 할 필요가 없습니다.
Sampson

1
@Slawek 나는 거기에 동의하지 않습니다. 사용자가 어떤 종류의 MVC 패턴을 따르고 있다는 표시가 보이지 않는다고 생각했습니다. 물론 컨트롤러 나 모델이있는 경우 많은 경우 배열을 정렬하는 것이 더 현명 할 수 있습니다.
Sampson


21

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 ()는 소스 배열을 변경하지 않지만 새 배열을 반환합니다.
Cláudio Silva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.