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

时间:2014-01-29 06:48:23

标签: php arrays sorting

我有一个像这样的数组

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
        )

)

我需要按顺序对多维数组中的键进行排序。这是输出。

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
        )

)

在此,您可以看到订单分类时的名称和链接也按顺序排序。我怎么能用PHP做到这一点。

4 个答案:

答案 0 :(得分:0)

您必须将array_map()sort()结合使用 如果您想保留实际的元素顺序,则必须使用asort()代替sort()

试试这段代码:

$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

答案 1 :(得分:0)

试试这个,它使用array_multisort

$array持有:

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)


代码:

$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);


输出:

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)

答案 2 :(得分: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;
}

在下面包含此功能以运行我自己的功能。同样归功于@Matt Whittingham我从

获取此代码
function is_assoc($array)
{
    $keys = array_keys($array);
    return array_keys($keys) !== $keys;
}

现在让我们做一些排序'... print_r(my_sort_2($arr,$this_arr));假设$ arr包含Shan的数组。

输出完全您想要的。

它将搜索嵌套数组(至少是预期的)并查看它是否在标准的数字排序键中(简而言之,不是自定义顺序 - 尚未;而不是关联)然后按照您想要的方式对其进行排序。

注意:我知道我的代码可能不是那么好,优化或没有bug,这是我的第二次尝试,第一次误解你的要求(参见函数名称?)。

答案 3 :(得分:0)

经过一些研究,我发现了一个像这样的简单解决方案

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']);

虽然我不想在所有密钥上应用array_replacearray_flip,但暂时还是这样做了。我一定会试图找到如何通过单指令来完成它。