PHP Сортировка многомерного массива по убыванию целых чисел

У меня есть двумерный массив в 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>";

Я бы использовал uasort, и ваш cmp выглядит так: stackoverflow.com/questions/21898455/…

hppycoder 09.04.2021 22:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
22
4

Ответы 4

Если вы используете 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?

hppycoder 09.04.2021 22:40

Автоматически сгенерируйте и протестируйте его :) Готов поспорить, что накладные расходы не заметны ... На самом деле - я готов поспорить, что функция usort использует цикл в фоновом режиме, поэтому он, вероятно, будет идентичным.

Zak 09.04.2021 22:42

Это концептуально, но я думаю, что другой ответ здесь (гармоксин) является кратчайшим с использованием наиболее эффективного из возможных способов. Я вытащил свой в отдельную функцию, но usort использовал бы родная библиотека C.

hppycoder 09.04.2021 22:47

4 очень разных ответа, приходящих к одному концу .. Еще один пример TMTOWTDI

Zak 09.04.2021 22:50

Добро пожаловать в PHP! Давай покажем тебе окрестности. ржу не могу

hppycoder 09.04.2021 22:51

Ха! Разве это не правда!

Zak 09.04.2021 22:52

Используя то, что обсуждалось в комментариях, он объединит 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)

Другие вопросы по теме