How to sort a 2d array by a column value in PHP ?

To sort a 2D array in PHP by a specific column value, you can use the usort() or uasort() functions with a custom comparison function. Here’s a detailed guide with examples:

1. Basic Sorting (Ascending/Descending)

Use usort() to sort by a numeric column (e.g., age).

Example 1: Sort by Numeric Column (Ascending)

$users = [
    ['name' => 'Alice', 'age' => 30],
    ['name' => 'Bob', 'age' => 25],
    ['name' => 'Charlie', 'age' => 35]
];

// Sort by 'age' ascending
usort($users, function($a, $b) {
    return $a['age'] <=> $b['age']; // Spaceship operator (PHP 7+)
});

print_r($users);

Output:

Array
(
    [0] => Array ( [name] => Bob [age] => 25 )
    [1] => Array ( [name] => Alice [age] => 30 )
    [2] => Array ( [name] => Charlie [age] => 35 )
)

Example 2: Sort by Numeric Column (Descending)

usort($users, function($a, $b) {
    return $b['age'] <=> $a['age'];
});

print_r($users);

Output:

Array
(
    [0] => Array ( [name] => Charlie [age] => 35 )
    [1] => Array ( [name] => Alice [age] => 30 )
    [2] => Array ( [name] => Bob [age] => 25 )
)

2. Sorting by String Column

Use strcmp() to sort alphabetically (case-sensitive).

Example 3: Sort by String Column (Ascending)

usort($users, function($a, $b) {
    return strcmp($a['name'], $b['name']);
});

print_r($users);

Output:

Array
(
    [0] => Array ( [name] => Alice [age] => 30 )
    [1] => Array ( [name] => Bob [age] => 25 )
    [2] => Array ( [name] => Charlie [age] => 35 )
)

Example 4: Case-Insensitive Sorting

usort($users, function($a, $b) {
    return strcasecmp($a['name'], $b['name']);
});

3. Preserving Keys with uasort()

Use uasort() to maintain key associations.

Example 5: Sort Associative Array by Column

$users = [
    'u1' => ['name' => 'Alice', 'age' => 30],
    'u2' => ['name' => 'Bob', 'age' => 25],
    'u3' => ['name' => 'Charlie', 'age' => 35]
];

uasort($users, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

print_r($users);

Output (keys preserved):

Array
(
    [u2] => Array ( [name] => Bob [age] => 25 )
    [u1] => Array ( [name] => Alice [age] => 30 )
    [u3] => Array ( [name] => Charlie [age] => 35 )
)

4. Sorting by Multiple Columns

Sort by age first, then name.

Example 6: Multi-Column Sort

usort($users, function($a, $b) {
    // First by age, then by name
    return [$a['age'], $a['name']] <=> [$b['age'], $b['name']];
});

5. Handling Edge Cases

Example 7: Missing Column Values

Add checks for missing keys:

usort($users, function($a, $b) {
    $ageA = $a['age'] ?? 0; // Default to 0 if 'age' doesn't exist
    $ageB = $b['age'] ?? 0;
    return $ageA <=> $ageB;
});

Example 8: Numeric Strings

Convert string values to numbers:

usort($users, function($a, $b) {
    return (int)$a['age'] <=> (int)$b['age'];
});

Summary

  • usort(): Sorts a 2D array and reindexes keys.
  • uasort(): Sorts a 2D array while preserving keys.
  • Spaceship Operator (`<=>)**: Simplifies numeric/string comparisons (PHP 7+).
  • strcmp()/strcasecmp(): For string comparisons (case-sensitive/insensitive).

By defining a custom comparison function, you can sort 2D arrays by any column!

Leave a Reply

Your email address will not be published. Required fields are marked *