Parag Tyagi
Parag Tyagi

Reputation: 8970

Sorting multidimensional associative array for a particular key by its value is ascending order

I have the following array:

Array
(
[Bridge Work] => Array
    (
        [0] => Array
            (
                [Name] => NJ Trunpike_Bridge Repair Work
                [Location] => New Jersey
                [State] => New Jersey
            )

        [1] => Array
            (
                [Name] => Honoapiilani Highway Bridge Truss
                [Location] => Maui
                [State] => Hawai
            )

        [2] => Array
            (
                [Name] => BlueCross Blueshield of Tennessee (Bridge)
                [Location] => Memphis
                [State] => Tennessee
            )

        [3] => Array
            (
                [Name] => Henderson Center Connector Bridge
                [Location] => Coquitlam
                [State] => British Columbia
            )

    )

[Educational] => Array
    (
        [0] => Array
            (
                [Name] => RTI TASS Complex Admin Bldg
                [Location] => Bluffdale
                [State] => Utah
            )

        [1] => Array
            (
                [Name] => Auburn High School
                [Location] => Auburn
                [State] => Washington
            )

        [2] => Array
            (
                [Name] => Reed College
                [Location] => Portland
                [State] => Oregon
            )

        [3] => Array
            (
                [Name] => Shorewood High School
                [Location] => Shoreline
                [State] => Washington
            )

    )

)

Taking in consideration key State and its value, I want to sort it in ascending order.

Expected output:

Array
(
[Bridge Work] => Array
    (
        [0] => Array
            (
                [Name] => Henderson Center Connector Bridge
                [Location] => Coquitlam
                [State] => British Columbia
            )

        [1] => Array
            (
                [Name] => Honoapiilani Highway Bridge Truss
                [Location] => Maui
                [State] => Hawai
            )

        [2] => Array
            (
                [Name] => NJ Trunpike_Bridge Repair Work
                [Location] => New Jersey
                [State] => New Jersey
            )

        [3] => Array
            (
                [Name] => BlueCross Blueshield of Tennessee (Bridge)
                [Location] => Memphis
                [State] => Tennessee
            )

    )

[Educational] => Array
    (
        [0] => Array
            (
                [Name] => Reed College
                [Location] => Portland
                [State] => Oregon
            )

        [1] => Array
            (
                [Name] => RTI TASS Complex Admin Bldg
                [Location] => Bluffdale
                [State] => Utah
            )

        [2] => Array
            (
                [Name] => Auburn High School
                [Location] => Auburn
                [State] => Washington
            )

        [3] => Array
            (
                [Name] => Shorewood High School
                [Location] => Shoreline
                [State] => Washington
            )

    )

)

My attempts:

Using usort():

function cmp($a, $b) 
{
    return $a["State"] - $b["State"];
}

usort($project_archives, "cmp");

echo '<pre>'; print_r($project_archives);

And using a loop combined with asort():

function aasort(&$array, $key)
{
    $sorter = array();
    $ret    = array();

    reset($array);

    foreach ($array as $ii => $va) {
        $sorter[$ii] = $va[$key];
    }

    asort($sorter);

    foreach ($sorter as $ii => $va) {
        $ret[$ii] = $array[$ii];
    }

    $array = $ret;
    return $array;
}

$sort = aasort($project_archives, "State");

Upvotes: 0

Views: 3271

Answers (1)

user1978142
user1978142

Reputation: 7948

Alternatively, you could use a array_multisort() to sort those values inside the array (the child arrays) in ascending. Consider this example:

$original_values = array( 'Bridge Work' => array( array('Name' => 'NJ Trunpike_Bridge Repair Work', 'Location' => 'New Jersey', 'State' => 'New Jersey'), array('Name' => 'Honoapiilani Highway Bridge Truss', 'Location' => 'Maui', 'State' => 'Hawaii'), array('Name' => 'BlueCross Blueshield of Tennessee (Bridge)', 'Location' => 'Memphis', 'State' => 'Tennessee'), array('Name' => 'Henderson Center Connector Bridge', 'Location' => 'Coquitlam', 'State' => 'British Columbia'), ), 'Educational' => array( array('Name' => 'RTI TASS Complex Admin Bldg', 'Location' => 'Bluffdale', 'State' => 'Utah'), array('Name' => 'Auburn High School', 'Location' => 'Auburn', 'State' => 'Washington'), array('Name' => 'Reed College', 'Location' => 'Portland', 'State' => 'Oregon'), array('Name' => 'Shorewood High School', 'Location' => 'Shoreline', 'State' => 'Washington'), ),);

$sorted_values = array();
foreach($original_values as $key => $value) {
    $columns = null;
    foreach ($value as $index => $element) {
        $columns[] = $element['State'];
    }
    $temp = $value;
    array_multisort($columns, SORT_ASC, $temp);
    $sorted_values[$key] = $temp;
}

echo '<pre>';
print_r($sorted_values);
echo '</pre>';

Sample Code

Upvotes: 3

Related Questions