-2

I have an array like this

Array
(
    [name] => Array
        (
            [0] => img/test240.jpg
            [1] => img/cs1.jpg
            [2] => img/cs2.jpg
            [3] => img/cs3.jpg
        )

    [link] => Array
        (
            [0] => http://google.com
            [1] => http://google.com
            [2] => http://facebook.com
            [3] => http://orkut.com
        )

    [order] => Array
        (
            [0] => 4
            [1] => 1
            [2] => 2
            [3] => 3
        )

)

I need to sort it by order WHICH IS KEY in Multidimensional array. Here is output.

Array
(
    [name] => Array
        (
            [1] => img/cs1.jpg
            [2] => img/cs2.jpg
            [3] => img/cs3.jpg
            [0] => img/test240.jpg
        )

    [link] => Array
        (
            [1] => http://google.com
            [2] => http://facebook.com
            [3] => http://orkut.com
            [0] => http://google.com
        )

    [order] => Array
        (
            [1] => 1
            [2] => 2
            [3] => 3
            [0] => 4
        )

)

In this you can see when order is sorted name and link is also sorted according to the order. How can i do this with php.

Muhammad Raheel
  • 19,823
  • 7
  • 67
  • 103
  • 1
    Is it really sorted? Why is 0 after 3? Or do you mean you want to insert the first element at the end? Or you need it sorted according to the values of the "order" array? Anyway your question is not clear at the moment. – laurent Jan 29 '14 at 06:52
  • I dont think. I mean to say when the order values are sorted link and name values should be sorted according to order values – Muhammad Raheel Jan 29 '14 at 06:56
  • Raheel, please consider upvoting some of the other people who kindly gave of their time here, for answers that you believe merit it. As it is, you seem to have ignored them. I'm downvoting for this; as a high-rep user, you should be encouraging other members of the community. – halfer Aug 06 '14 at 12:56

4 Answers4

0

You have to use array_map() in conjunction with sort().
If you want to preserve actual element order you have to use asort() instead sort().

Try this code:

$arr = array(
    'name' => array(
        0 => 'img/test240.jpg',
        1 => 'img/cs1.jpg',
        2 => 'img/cs2.jpg',
        3 => 'img/cs3.jpg',
    ),
    'link' => array(
        0 => 'http://google.com',
        1 => 'http://google.com',
        2 => 'http://facebook.com',
        3 => 'http://orkut.com',
    ),
    'order' => array(
        0 => 4,
        1 => 1,
        2 => 2,
        3 => 3,
    ),
);
function mysort($a) {
    asort($a);
    return $a;
}
$arr = array_map('mysort', $arr);
print_r($arr);

Demo.

hindmost
  • 7,125
  • 3
  • 27
  • 39
0

Try this, it uses array_multisort:

$array holds:

array (size=3)
  'name' => 
    array (size=4)
      0 => string 'img/test240.jpg' (length=15)
      1 => string 'img/cs1.jpg' (length=11)
      2 => string 'img/cs2.jpg' (length=11)
      3 => string 'img/cs3.jpg' (length=11)
  'link' => 
    array (size=4)
      0 => string 'http://google.com' (length=17)
      1 => string 'http://google.com' (length=17)
      2 => string 'http://facebook.com' (length=19)
      3 => string 'http://orkut.com' (length=16)
  'order' => 
    array (size=4)
      0 => string '4' (length=1)
      1 => string '1' (length=1)
      2 => string '2' (length=1)
      3 => string '3' (length=1)


Code:

$sort = array();
foreach($array as $k) {
    foreach($k as $ind=>$val){
    $sort['name'][$ind] =  $array['name'][$ind];
    $sort['link'][$ind] =  $array['link'][$ind];
    $sort['order'][$ind] =  $array['order'][$ind];
    }
}

array_multisort($sort['order'], SORT_ASC, $sort['link'], SORT_ASC, $sort['name'], SORT_ASC);
var_dump($sort);


Output:

array (size=3)
  'name' => 
    array (size=4)
      0 => string 'img/cs1.jpg' (length=11)
      1 => string 'img/cs2.jpg' (length=11)
      2 => string 'img/cs3.jpg' (length=11)
      3 => string 'img/test240.jpg' (length=15)
  'link' => 
    array (size=4)
      0 => string 'http://google.com' (length=17)
      1 => string 'http://facebook.com' (length=19)
      2 => string 'http://orkut.com' (length=16)
      3 => string 'http://google.com' (length=17)
  'order' => 
    array (size=4)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '3' (length=1)
      3 => string '4' (length=1)
AyB
  • 11,609
  • 4
  • 32
  • 47
0
$this_arr = array(1,2,3,0);

function my_sort_2($arr, $arrangement)
{
    $flag = false;

    foreach($arr as $key => $val)
    {
        if(is_array($arr[$key]))
        {
            $arr[$key] = my_sort_2($arr[$key],$arrangement);
            $flag = true;
        }
    }

    if($flag == false && is_array($arr) && is_assoc($arr) === false)
    {
        $temp = array();
        for($i = 0; $i < count($arrangement); $i++)
        {
            if(isset($arr[$arrangement[$i]]))
            {
                $temp[$arrangement[$i]] = $arr[$arrangement[$i]];
                unset($arr[$arrangement[$i]]);
            }
        }
        //$arr = array_merge($temp,$arr);
        $arr = $temp;
    }

    return $arr;
}

Include this function below to run my own function. Also credit to @Matt Whittingham where i got this code from

function is_assoc($array)
{
    $keys = array_keys($array);
    return array_keys($keys) !== $keys;
}

Now let's do some sortin'... print_r(my_sort_2($arr,$this_arr)); assuming $arr contains Shan's array.

The output is EXACTLY what you desired.

It'll search for nested array (at least intended) and see if it's in a standard numeric ordered keys (in short, not custom order - yet; and not assoc) then sort it the way you want.

Note: I know my code isn't that probably good, optimized or bug free and that's my second attempt, misunderstanding your requirements first time (see the function name?).

Community
  • 1
  • 1
Craftein
  • 762
  • 5
  • 10
0

Well after some research i found a simple solution like this

asort($data['order']);
$keys   =   array_keys($data['order']);

$data['name']   =   array_replace(array_flip($keys), $data['name']);
$data['link']   =   array_replace(array_flip($keys), $data['link']);
$data['order']  =   array_replace(array_flip($keys), $data['order']);

Although i dont want to apply array_replace and array_flip on all the keys but this is done for the time being. I will surely trying to find how i can do it with single instruction.

Muhammad Raheel
  • 19,823
  • 7
  • 67
  • 103