maria
maria

Reputation: 159

Sort multidimentional array PHP by ids

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

Answers (3)

RJParikh
RJParikh

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

Jayesh Chitroda
Jayesh Chitroda

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

chandresh_cool
chandresh_cool

Reputation: 11830

You should try usort :

function sortIt($a, $b) {
    return strcasecmp($a['id'],$b['id']);
}

usort($resultArray, 'sortIt');

Upvotes: 0

Related Questions