У меня есть двумерный массив в PHP, который содержит город, его штат и население. Если я построю это так:
$cities = array (
array("New York", "NY", 8008278),
array("Los Angeles", "CA", 3694820),
array("Chicago", "IL", 2896016),
array("Houston", "TX", 1953631),
array("Philadelphia", "PA", 1517550),
array("Phoenix", "AZ", 1321045),
array("San Diego", "CA", 1223400),
array("Dallas", "TX", 1188580),
array("San Antonio", "TX", 1144646),
array("Detroit", "MI", 951270)
);
Как отсортировать по численности населения (3-я строка) в порядке убывания? Вот код для вывода данных в таблицу.
echo "<table>";
for ($row = 0; $row < 10; $row++) {
echo "<tr>";
for ($col = 0; $col < 3; $col++) {
echo "<td>".$cities[$row][$col]."</td>";
}
echo "</tr>";
}
echo "</table>";






Если вы используете PHP7 +, вы можете добиться этого примерно так:
usort($cities, function($a, $b) {
return $a[2] <=> $b[2];
});
Если вы используете более раннюю версию, вы можете изменить оператор космического корабля (<=>) на
$a[2] - $b[2]
Я бы использовал цикл, чтобы вытащить целые числа - затем отсортировать их с помощью sort()
После этого я бы перебрал целые числа array() - И вложенный цикл и проверил бы равенство .. Если равно .. Создайте новый массив ..
<?php
$cities = array (
array("New York", "NY", 8008278),
array("Los Angeles", "CA", 3694820),
array("Chicago", "IL", 2896016),
array("Houston", "TX", 1953631),
array("Philadelphia", "PA", 1517550),
array("Phoenix", "AZ", 1321045),
array("San Diego", "CA", 1223400),
array("Dallas", "TX", 1188580),
array("San Antonio", "TX", 1144646),
array("Detroit", "MI", 951270)
);
$city_integers = array();
foreach ($cities as $city){
$integer = $city[2];
array_push($city_integers, $integer);
}
sort($city_integers);
print_r ($city_integers);
$final_array = array();
foreach ($city_integers as $key =>$item){
foreach($cities as $city){
if ($city[2] == $item){
$final_array[$key] = $city;
}
}
}
print_r ($final_array);
ВЫХОД
Array
(
[0] => Array
(
[0] => Detroit
[1] => MI
[2] => 951270
)
[1] => Array
(
[0] => San Antonio
[1] => TX
[2] => 1144646
)
[2] => Array
(
[0] => Dallas
[1] => TX
[2] => 1188580
)
[3] => Array
(
[0] => San Diego
[1] => CA
[2] => 1223400
)
[4] => Array
(
[0] => Phoenix
[1] => AZ
[2] => 1321045
)
[5] => Array
(
[0] => Philadelphia
[1] => PA
[2] => 1517550
)
[6] => Array
(
[0] => Houston
[1] => TX
[2] => 1953631
)
[7] => Array
(
[0] => Chicago
[1] => IL
[2] => 2896016
)
[8] => Array
(
[0] => Los Angeles
[1] => CA
[2] => 3694820
)
[9] => Array
(
[0] => New York
[1] => NY
[2] => 8008278
)
)
Что будет, если вместо 10 городов будет 10 тысяч? Будет ли эффективным использование нескольких массивов и операторов foreach?
Автоматически сгенерируйте и протестируйте его :) Готов поспорить, что накладные расходы не заметны ... На самом деле - я готов поспорить, что функция usort использует цикл в фоновом режиме, поэтому он, вероятно, будет идентичным.
Это концептуально, но я думаю, что другой ответ здесь (гармоксин) является кратчайшим с использованием наиболее эффективного из возможных способов. Я вытащил свой в отдельную функцию, но usort использовал бы родная библиотека C.
4 очень разных ответа, приходящих к одному концу .. Еще один пример TMTOWTDI
Добро пожаловать в PHP! Давай покажем тебе окрестности. ржу не могу
Ха! Разве это не правда!
Используя то, что обсуждалось в комментариях, он объединит usort вместе с хорошим cmp для обработки многомерного массива.
\n в коде можно удалить. Я поместил их туда, чтобы вы могли увидеть это в действии.
<?php
function cmp($a, $b) {
if ($a[2] == $b[2]) {
return 0;
}
return ($a[2] < $b[2]) ? -1 : 1;
}
$cities = array(
array("New York", "NY", 8008278),
array("Los Angeles", "CA", 3694820),
array("Chicago", "IL", 2896016),
array("Houston", "TX", 1953631),
array("Philadelphia", "PA", 1517550),
array("Phoenix", "AZ", 1321045),
array("San Diego", "CA", 1223400),
array("Dallas", "TX", 1188580),
array("San Antonio", "TX", 1144646),
array("Detroit", "MI", 951270)
);
usort($cities, 'cmp');
echo "<table>\n";
foreach($cities as $city) {
echo "<tr>\n";
echo sprintf(" <td>%s</td><td>%s</td><td>%s</td>", $city[0], $city[1], $city[2]);
echo "</tr>\n";
}
echo "</table>\n";
Выход:
<table>
<tr>
<td>Detroit</td><td>MI</td><td>951270</td></tr>
<tr>
<td>San Antonio</td><td>TX</td><td>1144646</td></tr>
<tr>
<td>Dallas</td><td>TX</td><td>1188580</td></tr>
<tr>
<td>San Diego</td><td>CA</td><td>1223400</td></tr>
<tr>
<td>Phoenix</td><td>AZ</td><td>1321045</td></tr>
<tr>
<td>Philadelphia</td><td>PA</td><td>1517550</td></tr>
<tr>
<td>Houston</td><td>TX</td><td>1953631</td></tr>
<tr>
<td>Chicago</td><td>IL</td><td>2896016</td></tr>
<tr>
<td>Los Angeles</td><td>CA</td><td>3694820</td></tr>
<tr>
<td>New York</td><td>NY</td><td>8008278</td></tr>
</table>
Простой однострочник для сортировки массива без использования настраиваемого обратного вызова:
array_multisort($cities, array_column($cities, 2), SORT_DESC)
Я бы использовал uasort, и ваш
cmpвыглядит так: stackoverflow.com/questions/21898455/…