Php 是否根据值对数组值进行排序和显示?
给定以下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
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:)