PHP's USORT Callback Function Parameters

后端 未结 3 1748
离开以前
离开以前 2021-02-05 21:48

This is a really esoteric question, but I\'m genuinely curious. I\'m using usort for the first time today in years, and I\'m particularly interested in what exactly is going on.

3条回答
  •  [愿得一人]
    2021-02-05 22:05

    The exact definition of $a and $b will depend upon the algorithm used to sort the array. To sort anything you have to have a means to compare two elements, that's what the callback function is used for. Some sorting algorithms can start anywhere in the array, others can start only in a specific part of it so there's no fixed meaning in $a and $b other than they are two elements in the array that have to be compared according to the current algorithm.

    This method can be used to shed light upon which algorithm PHP is using.

    
    

    Output

    vinko@mithril:~$ php sort.php
    Comparing 18 to 19
    Comparing 56 to 18
    Comparing 12 to 18
    Comparing 1 to 18
    Comparing 12 to 1
    Comparing 56 to 19
    Array
    (
        [0] => 1
        [1] => 12
        [2] => 18
        [3] => 19
        [4] => 56
    )
    

    From the output and looking at the source we can see the sort used is indeed a quicksort implementation, check for Zend/zend_qsort.c in the PHP source (the linked to version is a bit old, but hasn't changed much).

    It picks the pivot in the middle of the array, in this case 18, then it needs to reorder the list so that all elements which are less (according to the comparison function in use) than the pivot come before the pivot and so that all elements greater than the pivot come after it, we can see it doing that when it compares everything to 18 at first.

    Some further diagrammatic explanation.

    Step 0: (1,19,18,12,56); //Pivot: 18, 
    Step 1: (1,12,18,19,56); //After the first reordering
    Step 2a: (1,12);         //Recursively do the same with the lesser, here 
                             //pivot's 12, and that's what it compares next if 
                             //you check the output.
    Step 2b: (19,56);        //and do the same with the greater
    

提交回复
热议问题