PHP Обратный Сортировать Ассоциативный Массив arsort () не работает?

Может ли кто-нибудь указать мне правильное направление, почему я не могу заставить arsort () работать над следующим:

$d=array();
$d['y'][0]['year'] = 2000;
$d['y'][1]['year'] = 2001;
$d['y'][2]['year'] = 2002;
$d['y'][3]['year'] = 2003;
$d['y'][4]['year'] = 2004;
$d['y'][5]['year'] = 2005;

arsort($d['y']);

$i=0
foreach ($d['y'] as $value){
$i++;

echo $d['y'][$i]['year'];

}

Это просто эхо в порядке 0,1,2,3,4 и т. Д. Я не могу найти то, что мне здесь не хватает?

Спасибо

1

Решение

Ваш код правильный, но вы делаете ошибку при печати.
Ссылаясь на значение, индексированное как $ d [‘y’] [‘5’] [‘year’], результатом всегда будет 2005. Соответственно, foreach отображает годы в порядке возрастания. Попробуйте вместо этого:

foreach($d['y'] as $value) {
echo $value['year'];
}

и вы увидите, что ваш массив в обратном порядке.

(Не используйте переменную $ i в цикле foreach)

1

Другие решения

Риккардо указал мне правильное направление, я обнаружил, что мне нужно использовать:

echo $value['year'];

и не

echo $d['y'][$i]['year'];

Поскольку счетчик $ i вызывал индексный номер напрямую, а не использовал отсортированный массив при зацикливании.

0

Так как arsort () поддерживает ассоциации ключей, переупорядоченный многомерный массив будет иметь нулевой элемент последним, а элемент 5 — первым. Использование цикла foreach может привести к тому, что в коде не будет отображаться отсортированный массив, если переменная $ i изначально установлена ​​в ноль. Чтобы избежать такой непреднамеренной ошибки, а также повысить производительность и упростить код, можно заменить цикл foreach следующим образом:

<?php

function showData($value,$key){
echo "$value\n";
}
array_walk_recursive( $d, 'showData');

array_walk_recursive (), как следует из его названия, рекурсивно обходит массив, чтобы найти данные. Обратный вызов позволяет легко получить доступ и отобразить значения.

Увидеть демонстрация

0

Это потому что arsort () сохранит ключ. Вы можете проверить руководство Вот.

Таким образом, после arsort () $ d аналогично приведенному ниже, но вы печатаете в обратном порядке, что делает его не отсортированным. Проверить живое демо.

Array
(
[y] => Array
(
[5] => Array
(
[year] => 2005
)

[4] => Array
(
[year] => 2004
)

[3] => Array
(
[year] => 2003
)

[2] => Array
(
[year] => 2002
)

[1] => Array
(
[year] => 2001
)

[0] => Array
(
[year] => 2000
)

)

)
0
По вопросам рекламы [email protected]