0

I have and array converted to JSON like so:

[
    {
        "name": "Sally",
        "nick_name": "sal",
        "availability": "0",
        "is_fav": "0"
    },
    {
        "name": "David",
        "nick_name": "dav07",
        "availability": "0",
        "is_fav": "1"
    },
    {
        "name": "Zen",
        "nick_name": "zen",
        "availability": "1",
        "is_fav": "0"
    },
    {
        "name": "Jackson",
        "nick_name": "jack",
        "availability": "1",
        "is_fav": "1"
    },
    {
        "name": "Rohit",
        "nick_name": "rod",
        "availability": "0",
        "is_fav": "0"
    },

]

I want to sort the whole array in following sequence based on values of is_fav, availability, and nick_name:

[ is_fav:1 availability:1 ]
[ is_fav:1 availability:0 ]
[ is_fav:0 availability:1 ]
[ is_fav:0 availability:0 ]

Where in each of those conditions the elements are ordered alphabetically using nick_name

So the final array in the above example would look like

[
    {
        "name": "Jackson",
        "nick_name": "jack",
        "availability": "1",
        "is_fav": "1"
    },
    {
        "name": "David",
        "nick_name": "dav07",
        "availability": "0",
        "is_fav": "1"
    },
    {
        "name": "Zen",
        "nick_name": "zen",
        "availability": "1",
        "is_fav": "0"
    },
    {
        "name": "Rohit",
        "nick_name": "rod",
        "availability": "0",
        "is_fav": "0"
    },
    {
        "name": "Sally",
        "nick_name": "sal",
        "availability": "0",
        "is_fav": "0"
    },
]
André Ferraz
  • 1,511
  • 11
  • 29
enemetch
  • 492
  • 2
  • 8
  • 21

3 Answers3

1

Try this array_multisort

$arr = json_decode($data, true);
// Obtain a list of columns
foreach ($arr as $key => $row) {
    $isFav[$key] = $row['is_fav'];
    $avail[$key] = $row['availability'];
    $names[$key] = $row['nick_name'];
}

// Sort the data with isFav descending, avail descending
// Add $arr as the last parameter, to sort by the common key
array_multisort($isFav, SORT_DESC, $avail, SORT_DESC, $names, SORT_ASC, $arr);

You can see it in action here (3v4l.org)

Alex Tartan
  • 6,736
  • 10
  • 34
  • 45
  • This soulution seems to work for the order or `is_fav` and `availability`. But when in run it on the acual data, there is no sorting based on the `nick_name`. – enemetch Feb 19 '16 at 11:55
  • I still dont have correct order with `nick_name` :( I need ASC so I have changed to SORT_ASC. How is `null` treated while sorting? The values of `availability` is either `NULL` or `1` – enemetch Feb 19 '16 at 12:36
  • OH! My Bad. I didnt know it was case sensitive sort. Very Sorry. It works perfect.! – enemetch Feb 19 '16 at 12:46
1

You can use usort function of PHP like as

usort($arr,function($a,$b){
    $c = $b['is_fav'] - $a['is_fav'];
    $c .= $b['availability'] - $a['availability'];
    $c .= strcmp($a['nick_name'],$b['nick_name']);
    return $c;
});
print_r($arr);
Narendrasingh Sisodia
  • 21,247
  • 6
  • 47
  • 54
-1
$arr = json_decode($data, true);
usort($arr, function ($item1, $item2) {
    // your condition
    if ($item1['is_fav'] && !$item2['is_fav']) return 1;
    if (!$item1['is_fav'] && $item2['is_fav']) return -1;
    if ($item1['availability'] > $item2['availability']) return 1;
    if ($item1['availability'] < $item2['availability']) return -1;
    return 0;
});
$data = json_encode($arr);