PHP中的多类关联数组
考虑以下关联数组PHP中的多类关联数组,php,arrays,sorting,Php,Arrays,Sorting,考虑以下关联数组 $arr = Array ( [banana] => 2 [cherry] => 1 [orange] => 3 [grapefruit] => 1 [apple] => 1 ) 我想以类似于PLSQL术语的方式对其进行排序:a DESC,B ASC (其中A为数值,B为键)表示: 橘子和香蕉首先是因为它们的价值,然后我有苹果,樱桃和葡萄柚,按字母顺序排列,因为它们的价值相同 我的尝试: 一
$arr = Array
(
[banana] => 2
[cherry] => 1
[orange] => 3
[grapefruit] => 1
[apple] => 1
)
我想以类似于PLSQL术语的方式对其进行排序:a DESC,B ASC
(其中A为数值,B为键)表示:
橘子和香蕉首先是因为它们的价值,然后我有苹果,樱桃和葡萄柚,按字母顺序排列,因为它们的价值相同
我的尝试:
一,。运行,然后/希望第二个排序将把橙色和香蕉添加到数组的开头,而不会弄乱其他3项的字母排序。我错了。它确实把一切都搞砸了。所以我退房了:
2。和。但很明显,它同时对多个数组进行排序,或者是一个多维数组。
三,。我还尝试定义以下比较函数:
function cmp($a, $b)
{
foreach ($a as $key1 => $val1) {
foreach ($b as $key2 => $val2) {
if($val1 == $val2){
return strcmp($key1,$key2);
}
else if ($val1 > $val2){
return 1;
}
else{ // $val1 < $val2
return -1;
}
}
}
}
分类后:
Array
(
[children] => 1
[eager] => 1
[rule] => 1
[teacher] => 2
[lamb] => 3
)
函数polysortcmp($a,$b){
如果($a[1]$b[1])返回-1;
如果($a[0]$b[0])返回1;
返回0;
}
函数polysort(&$arr){
foreach($arr as$k=>$v)$arr[$k]=数组($k,$v);
uasort($arr,“polysortcmp”);
foreach($arr as$k=>$v)$arr[$k]=$v[1];
}
您可以使用
它的工作原理如下:
- 对于每个用于排序的列(值和键),创建新的1d数组及其内容
- 按排序顺序将这些1d数组传递给array_multisort函数(首先是$value,然后是$keys),为每个数组添加排序顺序
- 最后一个参数必须是要排序的数组
(也许您会发现更容易理解)使用了数组排序函数arsort
$arr = array(
'banana' => 2,
'cherry' => 1,
'orange' => 3,
'grapefruit' => 1,
'apple' => 1
);
arsort($arr);
print_r($arr);
输出
Array ( [orange] => 3 [banana] => 2 [apple] => 1 [grapefruit] => 1 [cherry] => 1 )
您将如何使用生成的阵列?@Galen以一种在地球上从未见过的非常复杂和强大的方式;)关于第一种方法,它不起作用,因为PHP排序不稳定(即保持相等值的顺序)。我更新问题是为了告诉你如果我按你的方式尝试,结果会是什么。对不起,误读了你:我先按键排序,然后按值-更新了我的答案。现在它按字母顺序排序,但值按ASC顺序而不是DESC。我更新问题是为了告诉你代码的当前输出。你可以拿我举的例子来运行它。好的,第三次是魅力,再次更新我的答案。供您参考:排序顺序在
polysortcmp()
中,$a[1]
是值,$a[0]
是键。我不知道您为什么得到-1,您从我这里得到+1,因为您的解决方案确实有效,谢谢@alfasin谢谢:),人们的下表决速度如此之快,事件不解释为什么…如果我们想为每个要排序的元素添加多个排序标志,它会起作用吗?我尝试了arsort(),但它不起作用。它可能适用于我给出的特定示例,但不适用于一般情况。
function polysortcmp($a, $b) {
if ($a[1]<$b[1]) return 1;
if ($a[1]>$b[1]) return -1;
if ($a[0]<$b[0]) return -1;
if ($a[0]>$b[0]) return 1;
return 0;
}
function polysort(&$arr) {
foreach ($arr as $k=>$v) $arr[$k]=array($k,$v);
uasort($arr, "polysortcmp");
foreach ($arr as $k=>$v) $arr[$k]=$v[1];
}
<?php
$arr = Array
(
'banana' => 2,
'cherry' => 1,
'orange' => 3,
'grapefruit' => 1,
'apple' => 1
);
$values = array_values($arr);
$keys = array_keys($arr);
//first sort by values desc, then sort by keys asc
array_multisort($values, SORT_DESC, $keys, SORT_ASC, $arr);
print_r($arr);
// output:
/*
Array
(
[orange] => 3
[banana] => 2
[apple] => 1
[cherry] => 1
[grapefruit] => 1
)
*/
?>
$arr = array(
'banana' => 2,
'cherry' => 1,
'orange' => 3,
'grapefruit' => 1,
'apple' => 1
);
arsort($arr);
print_r($arr);
Array ( [orange] => 3 [banana] => 2 [apple] => 1 [grapefruit] => 1 [cherry] => 1 )