在键上排序php不同格式的多维数组

问题描述:

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.

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.

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.

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)

$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?).