Сортировать и отображать значения массива в соответствии со значением? - PullRequest
2 голосов
/ 09 января 2011

Учитывая следующий массив PHP :

Array
(
    [0] => Array
        (
            [name] => Restaurant 123
            [city] => Arlington
            [zip] => 22201
        )

    [1] => Array
        (
            [name] => Bar Foo
            [city] => Ballston
            [zip] => 22201
         )
     [2] => Array
        (
            [name] => Restaurant XYZ
            [city] => Ballston
            [zip] => 22201
         )

    [3] => Array
        (
            [name] => Restaurant 321
            [city] => Washington DC
            [zip] => 22201
         )

)

Как создать список, отсортированный по городу (в алфавитном порядке), чтобы он вывел что-то вроде:

Арлингтон

Ресторан 123

Ballston

Бар Foo

Ресторан XYZ

Вашингтон, округ Колумбия

Ресторан 321

EG, отсортировано сначала по названию города в алфавитном порядке, а затем по названию места, также по алфавиту.Также обратите внимание, что не указано, что название ресторана и города отсортированы в алфавитном порядке в указанном массиве.

Ответы [ 5 ]

2 голосов
/ 10 января 2011

Вы можете использовать usort, что позволяет сортировать массив на основе определенной пользователем функции сравнения.

2 голосов
/ 10 января 2011

Попробуйте usort (http://php.net/manual/en/function.usort.php), где вы можете определить собственную схему сортировки, например

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
2 голосов
/ 09 января 2011

Напишите функцию обратного вызова, которую вы можете передать usort , например

function compare_venues($a, $b)
{
  return strcmp($a['name'], $b['name']);
}
1 голос
/ 10 января 2011

Пользовательская сортировка должна выполнять свою работу:

http://us2.php.net/manual/en/function.uasort.php

1 голос
/ 10 января 2011

Похоже, есть две части того, что вы хотите - сортировка и отображение.

Для сортировки вы хотите использовать usort с небольшой функцией, определяющей сравнение

$sortFunc = function($a,$b) {return $a['city'] != $b['city'] 
                                 ? $a['city'] > $b['city']
                                 : $a['name'] > $b['name'];};

        // = function($a,$b) {return $a['city'] > $b['city'] || ($a['city'] == $b['city'] && $a['name'] > $b['name']);};
        // = function($a,$b) {return 100*strcmp($a['city'],$b['city']) + strcmp($a['name'],$b['name']);};
usort($arr, $sortFunc);

function displayNamesGroupedByCity($arr)
{
    $lastCity = '';
    foreach($arr as $v)
    {
        if ($v['city'] != $lastCity)
        {
             $lastCity = $v['city'];
             echo "<br /><strong>$lastCity</strong><br />";
        }
        else echo ', ';
        echo $v['name'];
    }
}

displayNamesGroupedByCity($arr);

Черт возьми, я собираюсь сделать что-то общее

function displayXgroupedByY($arr, $x, $y)
{
    $sortFunc = function($a,$b) use($x,$y) 
                               {return $a[$y] != $b[$y] 
                                 ? $a[$y] > $b[$y]
                                 : $a[$x] > $b[$y];};

    user($arr, $sortFunc);

    $lastCity = '';
    foreach($arr as $v)
    {
        if ($v['city'] != $lastCity)
        {
             $lastCity = $v['city'];
             echo "<br /><strong>$lastCity</strong><br />";
        }
        else echo ', ';
        echo $v['name'];
    }
    return $arr;
}

displayXGroupedByY($arr, 'name', 'city');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...