此处将为大家介绍关于PHPusort的有害行为的详细内容,此外,我们还将为您介绍关于dict.fromkeys的有害行为、PHPksort意外行为、PHP多维数组排序(usort,uasort)、PH
此处将为大家介绍关于PHP usort的有害行为的详细内容,此外,我们还将为您介绍关于dict.fromkeys的有害行为、PHP ksort意外行为、PHP 多维数组排序(usort,uasort)、PHP 多维数组排序(usort,uasort)_php技巧的有用信息。
本文目录一览:PHP usort的有害行为
我对PHP usort()有问题.假设我有一个像这样的数组(这是一个简化,我没有使用名称,并且我有一个对象数组,而不是数组):
$data = array(
array('name' => 'Albert', 'last' => 'Einstein'),
array('name' => 'Lieserl', 'last' => 'Einstein'),
array('name' => 'Alan', 'last' => 'Turing' ),
array('name' => 'Mileva', 'last' => 'Einstein'),
array('name' => 'Hans Albert', 'last' => 'Einstein')
);
如您所见,该数组是任意排序的.
现在,如果要按最后排序,则可以执行以下操作:
function sort_some_people($a, $b) { return strcmp($a['last'], $b['last']); }
usort($data, 'sort_some_people');
我有:
Array (
[0] => Array ( [name] => Mileva [last] => Einstein )
[3] => Array ( [name] => Albert [last] => Einstein )
[1] => Array ( [name] => Lieserl [last] => Einstein )
[2] => Array ( [name] => Hans Albert [last] => Einstein )
[4] => Array ( [name] => Alan [last] => Turing )
)
可以,现在它们按最后排序.但是,正如您所看到的,我完全失去了之前的排序.我在说什么呢?我想像以前一样保留数组排序,但将其作为辅助排序.我希望我很清楚.实际上,我想使用诸如usort()之类的数据对数据进行排序(因此,这是一个完全自定义的排序),但是如果两个项目之间的排序字段相同,则我想保持它们的相对位置不变.考虑到给定的示例,我希望Lieserl Einstein出现在Mileva Einstein之前,因为一开始就是这样.
解决方法:
PHP中使用的排序算法具有此属性,如果项目匹配,则顺序不确定.
如果需要保持顺序,则必须滚动自己的代码.
幸运的是,已经有人:
http://www.php.net/manual/en/function.usort.php#38827
$data = array(
array('name' => 'Albert', 'last' => 'Einstein'),
array('name' => 'Lieserl', 'last' => 'Einstein'),
array('name' => 'Alan', 'last' => 'Turing' ),
array('name' => 'Mileva', 'last' => 'Einstein'),
array('name' => 'Hans Albert', 'last' => 'Einstein')
);
function sort_some_people($a, $b) {
return strcmp($a['last'], $b['last']);
}
function mergesort(&$array, $cmp_function = 'strcmp') {
// Arrays of size < 2 require no action.
if (count($array) < 2) return;
// Split the array in half
$halfway = count($array) / 2;
$array1 = array_slice($array, 0, $halfway);
$array2 = array_slice($array, $halfway);
// Recurse to sort the two halves
mergesort($array1, $cmp_function);
mergesort($array2, $cmp_function);
// If all of $array1 is <= all of $array2, just append them.
if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
$array = array_merge($array1, $array2);
return;
}
// Merge the two sorted arrays into a single sorted array
$array = array();
$ptr1 = $ptr2 = 0;
while ($ptr1 < count($array1) && $ptr2 < count($array2)) {
if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {
$array[] = $array1[$ptr1++];
}
else {
$array[] = $array2[$ptr2++];
}
}
// Merge the remainder
while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
return;
}
mergesort($data, 'sort_some_people');
print_r($data);
输出:
Array
(
[0] => Array
(
[name] => Albert
[last] => Einstein
)
[1] => Array
(
[name] => Lieserl
[last] => Einstein
)
[2] => Array
(
[name] => Mileva
[last] => Einstein
)
[3] => Array
(
[name] => Hans Albert
[last] => Einstein
)
[4] => Array
(
[name] => Alan
[last] => Turing
)
)
瞧!
dict.fromkeys的有害行为
我想使用初始化一个字典集(在Python 2.6中)dict.fromkeys
,但是结果结构表现得很奇怪。进一步来说:
>>>> x = {}.fromkeys(range(10),set([]))
>>>> x
{0: set([]),1: set([]),2: set([]),3: set([]),4: set([]),5: set([]),6: set([]),7: set([]),8: set([]),9: set([])}
>>>> x[5].add(3)
>>>> x
{0: set([3]),1: set([3]),2: set([3]),3: set([3]),4: set([3]),5: set([3]),6: set([3]),7: set([3]),8: set([3]),9: set([3])}
我显然不想将3加到所有集合中,而只添加到对应于的集合中x[5]
。当然,可以通过x
不使用进行初始化来避免此问题fromkeys
,但是我想了解一下我在这里缺少的内容。
PHP ksort意外行为
参见英文答案 > ksort produces wrong result when dealing with alphanumeric characters 6个
让我从一开始就告诉你:我知道这个函数的排序标志.当我使用SORT_STRING时,它运行良好,但默认标志SORT_REGULAR很奇怪,或根本不起作用.
考虑如下的数组.
$arr = [
'27a' => 'foo',
'27b' => 'foo',
'27c' => 'foo',
'27' => 'foo',
];
当我尝试使用ksort进行排序时,它会给出一个数组,而不会以任何明显的逻辑进行排序.
ksort($arr);
print_r($arr);
// this prints
Array
(
[27a] => foo
[27] => foo
[27b] => foo
[27c] => foo
)
可以说,密钥既不是数字上的,也不是字母上的,也不是自然分类的.更奇怪的是,当我更改源数组的顺序时,它会给出不同的结果:
$arr = [
'27a' => 'foo',
'27' => 'foo',
'27b' => 'foo',
'27c' => 'foo',
];
ksort($arr);
print_r($arr);
// this prints
Array
(
[27b] => foo
[27c] => foo
[27] => foo
[27a] => foo
)
有谁知道这背后的逻辑?这是一个错误还是我错过了什么?
编辑:谢谢大家对我的问题感兴趣和回答.虽然它被标记为重复,但另一个问题没有提到更奇怪的部分:为什么更改源数组的顺序会改变结果?它应该使用相同的输入集给出相同的结果.我们也要讨论这个吗?
解决方法:
之所以发生这种情况,是因为它将像’27a’这样的键视为一个字符串,并将像’27’这样的键视为整数,即使它被引用.如果从27键中删除引号,您将看到相同的结果.
并且,正如ksort page所说:“警告:在对具有混合类型值的数组进行排序时要小心,因为sort()会产生不可预测的结果.”
奇怪的行为肯定 – 不幸的是,当你的键看起来像整数(即使它们是字符串)时产生预期结果的最好方法是指定排序标志,如SORT_STRING,以确保每次都得到预期的结果.
PHP 多维数组排序(usort,uasort)
数字索引数组:
bool usort( array &$array,callback $cmp_function )
usort函数对指定数组(参数1)按指定方式(参数2)进行排序。
当我们想对多维数组进行排序时,多维数组的每个元素又是一数组类型,而两个数组如何比较大小?这是需要用户自定义的(是按每个数组的第一元素比较还是…)。 <div><adata="3182"id="copybut3182" onclick="doCopy('code3182')"> 代码如下:
PHP 多维数组排序(usort,uasort)_php技巧
数字索引数组:
bool usort( array &$array, callback $cmp_function )
usort函数对指定数组(参数1)按指定方式(参数2)进行排序。
当我们想对多维数组进行排序时,多维数组的每个元素又是一数组类型,而两个数组如何比较大小?这是需要用户自定义的(是按每个数组的第一元素比较还是…)。
//定义多维数组
$a = array(
array("sky", "blue"),
array("apple", "red"),
array("tree", "green"));
//自定义数组比较函数,按数组的第二个元素进行比较。
function my_compare($a, $b) {
if ($a[1] return -1;
else if ($a[1] == $b[1])
return 0;
else
return 1;
}
//排序
usort($a, ''my_compare'');
//输出结果
foreach($a as $elem) {
echo "$elem[0] : $elem[1]
";
}
?>
结果为:
sky : blue
tree : green
apple : red