1

Using the below for sorting a multidimensional array by screen name:

$sortArray = array();

foreach($members as $member){
    foreach($member as $key=>$value){
        if(!isset($sortArray[$key])){
            $sortArray[$key] = array();
        }
        $sortArray[$key][] = $value;
    }
}

$orderby = "screen_name";

array_multisort($sortArray[$orderby],SORT_ASC,$members);

But uppercase is being sorted before lowercase:

Allan Brenda Greg works

But Frank comes before dan

There's a lot out there on sorting arrays, but I finally got this working using the above, wanted to see if there was an easy way to fix it?

3 Answers 3

1

uasort() should work for you

<?php

// custom sort function
function sort_by_screen_name($a, $b) {

    // compare using lowercase strings only
    $a = strtolower($a['screen_name']);
    $b = strtolower($b['screen_name']);

    if ($a == $b) {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

$members = array(
    array('screen_name'=>'Greg'),
    array('screen_name'=>'Allen'),
    array('screen_name'=>'dan'),
    array('screen_name'=>'Brenda'),
);

// uasort() like a boss!
uasort($members, 'sort_by_screen_name');

print_r($members);

Output

Array
(
    [1] => Array
        (
            [screen_name] => Allen
        )

    [3] => Array
        (
            [screen_name] => Brenda
        )

    [2] => Array
        (
            [screen_name] => dan
        )

    [0] => Array
        (
            [screen_name] => Greg
        )

)

Note: the original array keys are preserved using this method. If you'd like the keys to be rewritten, you can simply use usort().

Sign up to request clarification or add additional context in comments.

Comments

1

You can sort this with usort() and a custom sorting function. You can modify this data if you like to see how it suits your own custom details: http://codepad.org/b89HwmbM

$members = array(
  array( "loc" => "Ontario",   "first" => "Bob",  "screen_name" => "fooArt" ),
  array( "loc" => "Atlanta",   "first" => "Sal",  "screen_name" => "TIMMY!" ),
  array( "loc" => "Panama",    "first" => "Mick", "screen_name" => "Analog" ),
  array( "loc" => "Pensacola", "first" => "A",    "screen_name" => "Franky" ),
  array( "loc" => "McPherson", "first" => "Anna", "screen_name" => "annie9" )
);

usort( $members, 'custom_sort' );

function custom_sort( $m1, $m2 ){
  return strtolower( $m1['screen_name'] ) > strtolower( $m2['screen_name'] );
};

The output from this sorting method follows:

Array
(
    [0] => Array
        (
            [loc] => Panama
            [first] => Mick
            [screen_name] => Analog
        )

    [1] => Array
        (
            [loc] => McPherson
            [first] => Anna
            [screen_name] => annie_23
        )

    [2] => Array
        (
            [loc] => Ontario
            [first] => Bob
            [screen_name] => fooArt
        )

    [3] => Array
        (
            [loc] => Pensacola
            [first] => A
            [screen_name] => Franky
        )

    [4] => Array
        (
            [loc] => Atlanta
            [first] => Sal
            [screen_name] => TIMMY!
        )

)

1 Comment

This doesn't really help demonstrate usort's ability to handle multidimensional arrays.
0

It is not necessary to mutate the strings before comparing them. Just compare the column values case-insensitively with strcasecmp(). (Demo)

$members = [
    ['screen_name'=>'Greg'],
    ['screen_name'=>'Allen'],
    ['screen_name'=>'dan'],
    ['screen_name'=>'Brenda'],
];

uasort($members, fn($a, $b) => strcasecmp($a['screen_name'], $b['screen_name']));

var_export($members);

If you don't need to preserve the original first level keys, then array_multisort() can do this task with no iterated function calls. (Demo)

array_multisort(array_column($members, 'screen_name'), SORT_STRING | SORT_FLAG_CASE, $members);

var_export($members);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.