usort uses a comparison callback to order complex values.

compare two rows The callback returns how two values should be ordered.

Sort Callback

firstScore
sort_callback.php
Replay: real traced execution (multi-file project)
<?php
function by_score($left, $right) {
    return $left["score"] <=> $right["score"];
}

$firstScore = 5;
$rows = [
    ["name" => "Ada", "score" => $firstScore],
    ["name" => "Linus", "score" => 3]
];
usort($rows, "by_score");
$firstName = $rows[0]["name"];
$firstValue = $rows[0]["score"];

echo "firstScore=" . $firstScore . "\n";
echo "firstName=" . $firstName . "\n";
echo "firstValue=" . $firstValue . "\n";
<?php
function by_score($left, $right) {
    return $left["score"] <=> $right["score"];
}

$firstScore = 2;
$rows = [
    ["name" => "Ada", "score" => $firstScore],
    ["name" => "Linus", "score" => 3]
];
usort($rows, "by_score");
$firstName = $rows[0]["name"];
$firstValue = $rows[0]["score"];

echo "firstScore=" . $firstScore . "\n";
echo "firstName=" . $firstName . "\n";
echo "firstValue=" . $firstValue . "\n";
<?php
function by_score($left, $right) {
    return $left["score"] <=> $right["score"];
}

$firstScore = 9;
$rows = [
    ["name" => "Ada", "score" => $firstScore],
    ["name" => "Linus", "score" => 3]
];
usort($rows, "by_score");
$firstName = $rows[0]["name"];
$firstValue = $rows[0]["score"];

echo "firstScore=" . $firstScore . "\n";
echo "firstName=" . $firstName . "\n";
echo "firstValue=" . $firstValue . "\n";
  1. $firstScore ← 5, $rows ← Array

    6$firstScore→ 5 = 5; //@firstScore=2, 97$rows→ Array = [8    ["name" => "Ada", "score" => $firstScore5],9    ["name" => "Linus", "score" => 3]10];11usort($rowsArray, "by_score");12$firstName = $rows[0]["name"];
  2. function by_score($left, $right)

    1<?php2function by_score($leftArray, $rightArray) {3    return $left["score"]5 <=> $right["score"]3;4}
  3. $firstName ← Linus, $firstValue ← 3

    10];11usort($rowsArray, "by_score");12$firstName→ Linus = $rows[0]["name"]Linus;13$firstValue→ 3 = $rows[0]["score"]3;1415echo "firstScore=" . $firstScore5 . "\n";16echo "firstName=" . $firstNameLinus . "\n";17echo "firstValue=" . $firstValue3 . "\n";
    outputfirstScore=5
    firstName=Linus
    firstValue=3
  1. $firstScore ← 2, $rows ← Array

    6$firstScore→ 2 = 2;7$rows→ Array = [8    ["name" => "Ada", "score" => $firstScore2],9    ["name" => "Linus", "score" => 3]10];11usort($rowsArray, "by_score");12$firstName = $rows[0]["name"];
  2. function by_score($left, $right)

    1<?php2function by_score($leftArray, $rightArray) {3    return $left["score"]2 <=> $right["score"]3;4}
  3. $firstName ← Ada, $firstValue ← 2

    10];11usort($rowsArray, "by_score");12$firstName→ Ada = $rows[0]["name"]Ada;13$firstValue→ 2 = $rows[0]["score"]2;1415echo "firstScore=" . $firstScore2 . "\n";16echo "firstName=" . $firstNameAda . "\n";17echo "firstValue=" . $firstValue2 . "\n";
    outputfirstScore=2
    firstName=Ada
    firstValue=2
  1. $firstScore ← 9, $rows ← Array

    6$firstScore→ 9 = 9;7$rows→ Array = [8    ["name" => "Ada", "score" => $firstScore9],9    ["name" => "Linus", "score" => 3]10];11usort($rowsArray, "by_score");12$firstName = $rows[0]["name"];
  2. function by_score($left, $right)

    1<?php2function by_score($leftArray, $rightArray) {3    return $left["score"]9 <=> $right["score"]3;4}
  3. $firstName ← Linus, $firstValue ← 3

    10];11usort($rowsArray, "by_score");12$firstName→ Linus = $rows[0]["name"]Linus;13$firstValue→ 3 = $rows[0]["score"]3;1415echo "firstScore=" . $firstScore9 . "\n";16echo "firstName=" . $firstNameLinus . "\n";17echo "firstValue=" . $firstValue3 . "\n";
    outputfirstScore=9
    firstName=Linus
    firstValue=3