Php 是否根据值对数组值进行排序和显示?

Php 是否根据值对数组值进行排序和显示?,php,arrays,sorting,Php,Arrays,Sorting,给定以下PHP数组: Array ( [0] => Array ( [name] => Restaurant 123 [city] => Arlington [zip] => 22201 ) [1] => Array ( [name] => Bar Foo [city] =&g

给定以下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餐厅

鲍尔斯顿

巴福

XYZ餐厅

华盛顿特区

321餐厅


例如,先按城市名称的字母顺序排序,然后按场馆名称的字母顺序排序。还要注意的是,没有给出餐厅名称,也没有按照给定数组中的字母顺序对城市进行排序。

例如,编写一个可以传递给的回调函数

function compare_venues($a, $b)
{
  return strcmp($a['name'], $b['name']);
}
您可以使用,这使您能够根据用户定义的比较函数对数组进行排序。

请尝试usort(),您可以在其中定义自定义排序模式,如

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
函数cmp($a,$b)
{
如果($a=$b){
返回0;
}
回报率($a<$b)?-1:1;
}

看起来您需要的东西有两部分-排序和显示

要排序,您需要使用
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);
$sortFunc=function($a,$b){返回$a['city']!=$b['city']
?$a[“城市”]>$b[“城市”]
:$a['name']>$b['name'];};
//=函数($a,$b){return$a['city']>$b['city']| |($a['city']==$b['city']&&&$a['name']>$b['name']);
//=函数($a,$b){return 100*strcmp($a['city'],$b['city'])+strcmp($a['name'],$b['name']);};
usort($arr,$sortFunc);
函数displayNamesGroupedByCity($arr)
{
$lastCity='';
外汇($arr为$v)
{
如果($v['city']!=$lastCity)
{
$lastCity=$v['city'];
回声“
$lastCity
”; } 否则回声','; echo$v['name']; } } 显示名称按城市分组($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');
函数显示xgroupedbyy($arr,$x,$y)
{
$sortFunc=函数($a,$b)使用($x,$y)
{返回$a[$y]!=$b[$y]
?$a[$y]>$b[$y]
:$a[$x]>$b[$y];};
用户($arr,$sortFunc);
$lastCity='';
外汇($arr为$v)
{
如果($v['city']!=$lastCity)
{
$lastCity=$v['city'];
回声“
$lastCity
”; } 否则回声','; echo$v['name']; } 返回$arr; } displayXGroupedByY($arr,'name,'city');
用户定义的排序应完成以下工作:


嗨,Jon,我试过你的排序功能,但是打印($sorted)只会给我“1”而不是排序列表?除了遗漏的撇号,我想我已经删除了。是的,我修复了它。usort排序到位,返回值是booleanOK cool,这几乎可以正常工作,除了项目的顺序似乎相反,例如,城市和场馆都是向后的?哈,我刚刚注意到我自己。您将比较结果改为小于,我猜?我刚刚颠倒了$sortFunc=function()中的$a、$b:)