加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用array_multisort对数组进行排序

发布时间:2020-12-13 17:57:12 所属栏目:PHP教程 来源:网络整理
导读:我有以下数组: $array = array( 'note' = array(),'year' = array('2011','2010','2012'),'type' = array('conference','journal','conference'),); 我使用以下函数使用字段类型和另一个数组对数组进行排序: function array_multisort_by_order(array $arr
我有以下数组:
$array = array(
        'note' => array(),'year' => array('2011','2010','2012'),'type' => array('conference','journal','conference'),);

我使用以下函数使用字段类型和另一个数组对数组进行排序:

function array_multisort_by_order(array $array,$by,array $order)
{
    $order = array_flip($order);
    $params[] = $array[$by];
    foreach($params[0] as &$v) $v = $order[$v];
    foreach($array as &$v) $params[] = &$v; unset($v);
    call_user_func_array('array_multisort',$params);
    return $array;
}

当我调用以下函数时,我收到以下错误:

$array = array_multisort_by_order($array,'type',array('conference','journal'));

print_r($array['type']);

错误:

Warning: array_multisort(): Array sizes are inconsistent.

我知道数组是不一致的.有更好的功能使用吗?

请检查:codepad

期望的输出:

Array
(
[note] => Array
    (
        [0] => 
        [1] => 
        [2] => 
    )

[year] => Array
    (
        [0] => 2011
        [1] => 2012
        [2] => 2010
    )

[type] => Array
    (
        [0] => conference
        [1] => conference
        [2] => journal
    )

)

例2:

排列

$array = array(
        'note' => array([0]=>'test1',[1]=>'test2'),'year' => array([0]=>'2011',[2]=>'2012'),'type' => array([0]=>'conference',[1]=>'journal',[2]=>'conference'),);

期望的结果2

Array
(
[note] => Array
    (
        [0] => test1
        [1] => 
        [2] => tes2
    )

[year] => Array
    (
        [0] => 2011
        [1] => 2012
        [2] => 
    )

[type] => Array
    (
        [0] => conference
        [1] => conference
        [2] => journal
    )

)

谢谢

好的,首先想到的解决方案之一就是添加空值以使它们保持一致:
function array_multisort_by_order(array $array,array $order)
{
     $max = max(array_map('count',$array));
    //or,alternatively,depending on input (if there are no 'complete' subarrays):
    //$max = max(array_map(function($arr){return max(array_keys($arr));},$array))+1;

    //ADDITION: negative numeric keys:
    $min = min(array_map(function($arr){return min(array_keys($arr));},$array));
    $width = $max - min(0,$min);

    foreach($array as &$sub){
        // $addin = array_diff_key(array_fill(0,$max,null),$sub);
        // $addin changed for negative keys:
        $addin = array_diff_key(array_combine(range($min,$max),array_fill(0,$width,null)),$sub);
        $sub = $addin + $sub;
        ksort($sub);
    }
    $order = array_flip($order);
    $params[] = $array[$by];
    foreach($params[0] as &$v) $v = $order[$v];
    foreach($array as &$v) $params[] = &$v; unset($v);
    call_user_func_array('array_multisort',$params);
    //no closeures here:
    //foreach($array as &$sub) $sub = array_filter(function($a){return !is_null($a);},$sub);
    $filter = create_function('$a','return !is_null($a);');
    foreach($array as &$sub) $sub = array_filter($sub,$filter);
    return $array;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读