Reputation: 159
Im trying to sort an multidimentional array based on a array in the order i would like it to appear in.
the $lookingfor
array contains the order i would like it to appear, while $avaliableArray
contains the whole multidimentional array. Would like the result in the example code called $resultarray
How would i do this, based on the id
of the elements in $avaliableArray
?
code:
$avaliableArray = array(
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-1"),
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-4"),
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-8")
);
$lookingFor = array(1,8,4);
looking for result:
$resultArray = array(
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-1"),
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-8"),
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-4")
);
Upvotes: 0
Views: 71
Reputation: 4166
Use usort()
and apply proper id to $lookingFor
same as array value.
$avaliableArray = array(
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-1"),
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-4"),
array('name' => 'Banken', 'site' => 'bank', 'avaliable' => true, 'type' => 'site', 'id' => "testid-8")
);
$lookingFor = array("testid-1","testid-8","testid-4");
usort($avaliableArray, function ($a, $b) use ($lookingFor) {
$pos_a = array_search($a['id'], $lookingFor);
$pos_b = array_search($b['id'], $lookingFor);
return $pos_a - $pos_b;
});
echo "<pre>";
print_r($avaliableArray);
Output
Array
(
[0] => Array
(
[name] => Banken
[site] => bank
[avaliable] => 1
[type] => site
[id] => testid-1
)
[1] => Array
(
[name] => Banken
[site] => bank
[avaliable] => 1
[type] => site
[id] => testid-8
)
[2] => Array
(
[name] => Banken
[site] => bank
[avaliable] => 1
[type] => site
[id] => testid-4
)
)
Upvotes: 1
Reputation: 5039
Try this:
function sortArr($a, $b) {
return intval(preg_replace('/[^0-9]+/', '', $a['id']), 10) - intval(preg_replace('/[^0-9]+/', '', $b['id']), 10) ; // it will extract number from string and compare it
}
usort($avaliableArray, 'sortArr');
Upvotes: 0
Reputation: 11830
You should try usort :
function sortIt($a, $b) {
return strcasecmp($a['id'],$b['id']);
}
usort($resultArray, 'sortIt');
Upvotes: 0