鉴于以下 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
巴尔斯顿
Bar Foo
餐厅XYZ
华盛顿特区
餐厅321
E.G。,首先按字母顺序按城市名称排序,然后按地点名称排序,也按字母顺序排序。另请注意,没有给出餐馆名称,也没有给出城市按字母顺序排列的数组。
答案 0 :(得分:2)
编写一个可以传递给usort的回调函数,例如
function compare_venues($a, $b)
{
return strcmp($a['name'], $b['name']);
}
答案 1 :(得分:2)
您可以使用 usort
,这样您就可以根据用户定义的比较函数对数组进行排序。
答案 2 :(得分:2)
尝试使用usort(http://php.net/manual/en/function.usort.php),您可以在其中定义自定义排序架构,例如
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
答案 3 :(得分: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);
为了它的地狱,我将使事情变得通用
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');
答案 4 :(得分:1)
用户定义的排序应该起作用: