Tom
Tom

Reputation: 781

Sorting array in 1 order by 2 keys

I have an array like so.

  [Badi Assad] => Array
    (
        [last_name] => Assad
        [first_name] => Badi
        [artist_name] => 
        [asterick] => *
        [slug] => badiassad
    )

[Ben Taylor] => Array
    (
        [last_name] => Taylor
        [first_name] => Ben
        [artist_name] => Ben Taylor
        [asterick] => *
        [slug] => bentaylor
    )

[Beverly] => Array
    (
        [last_name] => Hills
        [first_name] => Beverly
        [artist_name] => Beverly
        [asterick] => 
        [slug] => Eedih
    )

[Bruce Cockburn] => Array
    (
        [last_name] => Cockburn
        [first_name] => Bruce
        [artist_name] => Bruce Cockburn
        [asterick] => *
        [slug] => brucecockburn
    )

[Bohème] => Array
    (
        [last_name] => 
        [first_name] => Cassidy
        [artist_name] => Bohème
        [asterick] => *
        [slug] => cassidy
    )

How would I sort is so it it would be in order with the last name and artist name in order where the last name trumps the artist name except when it is empty.

The resulting should look like this.

  [Badi Assad] => Array
    (
        [last_name] => Assad
        [first_name] => Badi
        [artist_name] => 
        [asterick] => *
        [slug] => badiassad
    )
[Bohème] => Array
    (
        [last_name] => 
        [first_name] => Cassidy
        [artist_name] => Bohème
        [asterick] => *
        [slug] => cassidy
    )
[Bruce Cockburn] => Array
    (
        [last_name] => Cockburn
        [first_name] => Bruce
        [artist_name] => Bruce Cockburn
        [asterick] => *
        [slug] => brucecockburn
    )

[Beverly] => Array
    (
        [last_name] => Hills
        [first_name] => Beverly
        [artist_name] => Beverly
        [asterick] => 
        [slug] => Eedih
    )
[Ben Taylor] => Array
    (
        [last_name] => Taylor
        [first_name] => Ben
        [artist_name] => Ben Taylor
        [asterick] => *
        [slug] => bentaylor
    )

I am currently trying this.

    $newartists = array();
foreach($users as $k => $v)
 {
    $name = (strlen($v['artist_name']) > 0) ? $v['artist_name'] : $v['first_name'].' '.$v['last_name'];
    $newartists[$name]['last_name'] = $v['last_name'];
    $newartists[$name]['first_name'] = $v['first_name'];
    $newartists[$name]['artist_name'] = $v['artist_name'];
    $newartists[$name]['asterick'] = $ask;
    $newartists[$name]['slug'] = $v['slug'];
}                    
$sort = array();
foreach($newartists as $k=>$v) {
    $sort['artist_name'][$k] = $v['artist_name'];
    $sort['last_name'][$k] = $v['last_name'];
}

array_multisort( $sort['last_name'], SORT_ASC,$sort['artist_name'], SORT_ASC, $newartists);

Thanks!

Upvotes: 0

Views: 68

Answers (1)

Rolando Isidoro
Rolando Isidoro

Reputation: 5114

Use uasort function somewhat like this:

<?php
    $newartists = array(
        '3' => array(
            'last_name'   => 'c',
            'artist_name' => 'c'
        ),
        '1' => array(
            'artist_name' => 'a'
        ),
        '2' => array(
            'last_name'   => 'b',
            'artist_name' => 'd'
        ),
    );

    function cmp($a, $b)
    {
        $result = 0;

        // Sort preferably by last name
        if (!empty($a['last_name']) && !empty($b['last_name'])) {
            $result = strcmp($a["last_name"], $b["last_name"]);

        // Failover to artist name sort
        } else {
            $result = strcmp($a["artist_name"], $b["artist_name"]);
        }

        return $result;
    }

    usort($newartists, "cmp");

Result

Array
(
    [1] => Array
        (
            [artist_name] => a
        )

    [2] => Array
        (
            [last_name] => b
            [artist_name] => d
        )

    [3] => Array
        (
            [last_name] => c
            [artist_name] => c
        )
)

Upvotes: 1

Related Questions