一个数组根据另一个数组来排序

$a = Array
(
    Array (
        'cid'   => 1,
        'cname' => '关于'
    ),

    Array (
        'cid'   => 7,
        'cname' => '简介'
    ),

    Array (
        'cid'   => 8,
        'cname' => '文化'
    ),

    Array (
        'cid'   => 9,
        'cname' => '动态'
    )

);

$b = Array
(
    Array (
        'cid'   => 1,
        'cname' => '关于'
    ),

    Array (
        'cid'   => 2,
        'cname' => '歌剧'
    ),

    Array (
        'cid'   => 3,
        'cname' => '美剧'
    ),

    Array (
        'cid'   => 4,
        'cname' => '视频'
    ),

    Array (
        'cid'   => 5,
        'cname' => '娱乐'
    ),

    Array (
        'cid'   => 6,
        'cname' => '联系'
    ),

    Array (
        'cid'   => 7,
        'cname' => '简介'
    ),

    Array (
        'cid'   => 8,
        'cname' => '文化'
    ),

    Array (
        'cid'   => 9,
        'cname' => '动态'
    )

);
$c = Array
(
    Array (
        'cid'   => 1,
        'cname' => '关于'
    ),

    Array (
        'cid'   => 7,
        'cname' => '简介'
    ),

    Array (
        'cid'   => 8,
        'cname' => '文化'
    ),

    Array (
        'cid'   => 9,
        'cname' => '动态'
    ),

    Array (
        'cid'   => 2,
        'cname' => '歌剧'
    ),

    Array (
        'cid'   => 3,
        'cname' => '美剧'
    ),

    Array (
        'cid'   => 4,
        'cname' => '视频'
    ),

    Array (
        'cid'   => 5,
        'cname' => '娱乐'
    ),

    Array (
        'cid'   => 6,
        'cname' => '联系'
    )
);

已知$a,参照$a把$b排序成$c的样子。

阅读 8.1k
4 个回答

使用自定义排序函数usort来一发

<?php 

class SortByArray {
  
  public $ref;
  public $array;

  public function __construct($ref,$array){
   $this->ref = $ref;
   $this->array = $array;    
      usort($this->array,function($t1,$t2){
        $p1 = array_search($t1,$this->ref);
        $p2 = array_search($t2,$this->ref);
        if(($p1===false||$p1===null) && ($p2===false||$p2===null))
          return array_search($t1,$this->array)<array_search($t2,$this->array) ? -1 :1;
        if($p1===$p2) return 0;  
        if($p1===false||$p1===null) return 1;
        if($p2===false||$p2===null) return -1; 
        return $p1<$p2 ? -1 : 1;
      });  
  }
 
}

//----------------------
$res = new SortByArray($a,$b);
print_r($res->array);

?>

看了其他人的解法其实是需要$a中元素完全和$b匹配才能排序,
看了lz自己的解法,才知道题意是根据$a中某个字段排序
如果要完全匹配,就不是排序的问题了,也没必要整那么复杂:

$c= [];
foreach($b as $v) {
    if(! in_array($v, $a)) {
        $c[] = $v;
    }
}
$c = array_merge($a, $c);

如果lz的意思按照某个字段排序:

$column_b = array_column($b, 'cid');
$column_a = array_column($a, 'cid');
$diff = array_diff($column_b, $column_a);
$merge = array_merge($column_a, $diff);
$c = [];
foreach($merge as $key=>$val) {
    foreach($b as $k=>$v) {
        if($b[$k]['cid'] == $val) {
            $c[] = $v;
        }
    }
}

这个应该是多维数组排序问题,php中的 array_multisort可以用于多维数组排序。
具体实现代码就不写了,可以看看手册自己琢磨一下。

/**
 * [oneArrayTo 二维数组按某个数组值排序 一对多]
 * @param  [type] $a       [参照数组]
 * @param  [type] $b       [这个是要被排序的数组]
 * @param  [type] $keyword [键值]
 * @return [type]          [description]
 */
function oneArrayTo($a,$b,$keyword)
{
    $newa = array();
    foreach ($a as $key => $value) {
        $newa[] = $value[$keyword];
    }
    $newa = array_flip($newa);

    $newb = array();
    foreach ($b as $key => $value) {
        $newb[] = $value[$keyword];
    }
    $newb = array_flip($newb);

    $d = $newb;
    foreach ($newb as $k => $v) {
        foreach ($newa as $key => $value) {
            if($key == $k) {
                unset($d[$k]);
            }
        }
    }
    $c = array_flip($newa);
    $d = array_flip($d);

    $p = array_merge($c,$d);
    $p = array_flip($p);

    $newbb = array();
    foreach ($b as $key => $value) {
        $newbb[$value[$keyword]] = $value;
    }

    $g = array();
    foreach ($p as $key => $value) {
        $g[] = $newbb[$key];
    }
    
    return $g;
}

自己写好了,虽然是笨方法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏