GVKun编程网logo

PHP usort的有害行为

33

此处将为大家介绍关于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的有害行为

我对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的有害行为

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意外行为

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',
];

当我尝试使用kso​​rt进行排序时,它会给出一个数组,而不会以任何明显的逻辑进行排序.

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)

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技巧

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

关联数组:
bool uasort(array &$array, callback $cmp_function)
bool uksort(array &$array, callback $cmp_function)

uasort, uksort用法与usort相同,其中uasort()对关联数组的值(value)进行排序,uksort()对关联数组的关键字(key)进行排序。
复制代码 代码如下:

$a = array(
''Sunday'' => array(0,''7th''),
''Friday'' => array(5,''5th''),
''Tuesday''=> array(2,''2nd''));

function my_compare($a, $b) {
if ($a[1] return -1;
else if ($a[1] == $b[1])
return 0;
else
return 1;
}
//按$a数组的值的第二个元素(7th,5th,2nd)进行排序
uasort($a, ''my_compare'');
foreach($a as $key => $value) {
echo "$key : $value[0] $value[1]
";
}
//按$a数组的关键字的第二个字符(r,u,u)进行排序
uksort($a, ''my_compare'');
foreach($a as $key => $value) {
echo "$key : $value[0] $value[1]
";
}

?>

结果为:

Tuesday : 2 2nd
Friday : 5 5th
Sunday : 0 7th
Friday : 5 5th
Sunday : 0 7th
Tuesday : 2 2nd

今天关于PHP usort的有害行为的介绍到此结束,谢谢您的阅读,有关dict.fromkeys的有害行为、PHP ksort意外行为、PHP 多维数组排序(usort,uasort)、PHP 多维数组排序(usort,uasort)_php技巧等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇php-CodeIgniter:文件夹中的控制器,两者名称相同(文件管理器php)

下一篇PHP-MySQL,价格订购(php+mysql)