Answer
Solution:
You could use collection's sortBy method.
$array = array(
0 =>
array(
'member_reference_identifier' => '001',
'user_status' => 'Hold',
'is_primary' => 'true',
),
1 =>
array(
'member_reference_identifier' => '002',
'user_status' => 'Banned',
'is_primary' => 'true',
),
2 =>
array(
'member_reference_identifier' => '003',
'user' => 'Banned',
'is_primary' => 'true',
),
3 =>
array(
'member_reference_identifier' => '004',
'user_status' => 'Active',
'is_primary' => 'false',
),
4 =>
array(
'member_reference_identifier' => '005',
'user_status' => 'Active',
'is_primary' => 'true',
),
5 =>
array(
'member_reference_identifier' => '006',
'user_status' => 'Hold',
'is_primary' => 'true',
),
6 =>
array(
'member_reference_identifier' => '007',
'user_status' => 'Banned',
'is_primary' => 'true',
),
);
collect($array)
->sortBy(function ($item) {
if (!isset($item['user_status'] || !isset($item['is_primary'])) {
return 7;
} elseif ($item['user_status'] == 'Active' && $item['is_primary'] == 'true') {
return 1;
} elseif ($item['user_status'] == 'Hold' && $item['is_primary'] == 'true') {
return 2;
} elseif ($item['user_status'] == 'Banned' && $item['is_primary'] == 'true') {
return 3;
} elseif ($item['user_status'] == 'Active' && $item['is_primary'] == 'false') {
return 4;
} elseif ($item['user_status'] == 'Hold' && $item['is_primary'] == 'false') {
return 5;
} elseif ($item['user_status'] == 'Banned' && $item['is_primary'] == 'false') {
return 6;
} else {
return 7;
}
})
->values()
->all();
What I'm doing in the Closure is assigning a number to each possibility. This number is what the sortBy method will use to sort the data.
You could also use LazyCollections instead of Collections. The logic stays the same for the most part.
use Illuminate\Support\LazyCollection;
$sorted = LazyCollection::make($array)->sortBy(function ($item) {
...
})
->values()
->all();