1

Is it possible to sort (with php) an array like this by last name:

$array = array(
    array("name" => "Mary Johnson","age" => 43),
    array("name" => "Amanda Miller","age" => 23),
    array("name" => "James Brown","age" => 47),
    array("name" => "Patricia Williams","age" => 31),
    array("name" => "Michael Davis","age" => 15),
    array("name" => "Sarah Miller","age" => 35),
    array("name" => "Patrick Miller","age" => 44)
  ); 
<?php
// A function to sort by last name.
function lastNameSort($a, $b) {
    $aLast = end(explode(' ', $a));
    $bLast = end(explode(' ', $b));

    return strcasecmp($aLast, $bLast);
}


// The array of data.
$array = array(
    array("name" => "Mary Johnson","age" => 43),
    array("name" => "Amanda Miller","age" => 23),
    array("name" => "James Brown","age" => 47),
    array("name" => "Patricia Williams","age" => 31),
    array("name" => "Michael Davis","age" => 15),
    array("name" => "Sarah Miller","age" => 35),
    array("name" => "Patrick Miller","age" => 44)
  );

// Perform the sort:
uasort($array, 'lastNameSort');

// Print the result:
print_r($array);
RiggsFolly
  • 93,638
  • 21
  • 103
  • 149
Cristian
  • 11
  • 1

1 Answers1

1

Its just an addressing issue. Amend you function as below, remember the $a and $b are arrays and not scalar variables.

$array = array(
    array("name" => "Mary Johnson","age" => 43),
    array("name" => "Amanda Miller","age" => 23),
    array("name" => "James Brown","age" => 47),
    array("name" => "Patricia Williams","age" => 31),
    array("name" => "Michael Davis","age" => 15),
    array("name" => "Sarah Miller","age" => 35),
    array("name" => "Patrick Miller","age" => 44)
  ); 

function sortByName($a, $b) {
    $aLast = explode(' ', $a['name'])[1];
    $bLast = explode(' ', $b['name'])[1];

    return strcasecmp($aLast, $bLast);
}

#print_r($array);
usort($array, 'sortByName');
print_r($array);

RESULT

Array
(
    [0] => Array (   [name] => James Brown       [age] => 47 )
    [1] => Array (   [name] => Michael Davis     [age] => 15 )
    [2] => Array (   [name] => Mary Johnson      [age] => 43 )
    [3] => Array (   [name] => Amanda Miller     [age] => 23 )
    [4] => Array (   [name] => Sarah Miller      [age] => 35 )
    [5] => Array (   [name] => Patrick Miller    [age] => 44 )
    [6] => Array (   [name] => Patricia Williams [age] => 31 )
)

And to get the Millers in the correct order by firstname as well as lastname, you code amend the sort function a little as below

function sortByName($a, $b) {
    $t = explode(' ', $a['name']);
    $aLast = $t[1] . $t[0];
    $t = explode(' ', $b['name'])[1];
    $bLast = $t[1] . $t[0];

    return strcasecmp($aLast, $bLast);
}
RiggsFolly
  • 93,638
  • 21
  • 103
  • 149