Php 对多维数组排序并保留同级

Php 对多维数组排序并保留同级,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我如何按类型排序以下数组,其中url首先出现,然后是文档然后是页面 $array = array( 0 => array( 'id' => '14', 'position' => '0', 'type' => 'related-url' ), 1 => array( 'id' => '2367', 'position' => '0',

我如何按
类型
排序以下数组,其中
url
首先出现,然后是
文档
然后是
页面

$array = array(
    0 => array(
        'id' => '14',
        'position' => '0',
        'type' => 'related-url'
    ),
    1 => array(
        'id' => '2367',
        'position' => '0',
        'type' => 'related-doc'
    ),
    2 => array(
        'id' => '99',
        'position' => '0',
        'type' => 'related-page'
    ),
    4 => array(
        'id' => '180',
        'position' => '2',
        'type' => 'related-doc'
    ),
    5 => array(
        'id' => '10',
        'position' => '3',
        'type' => 'related-doc'
    )
);
结果将是

$array = array(
    0 => array(
        'id' => '14',
        'position' => '0',
        'type' => 'related-url'
    ),
    1 => array(
        'id' => '2367',
        'position' => '0',
        'type' => 'related-doc'
    ),
    4 => array(
        'id' => '180',
        'position' => '2',
        'type' => 'related-doc'
    ),
    5 => array(
        'id' => '10',
        'position' => '3',
        'type' => 'related-doc'
    ),
    2 => array(
        'id' => '99',
        'position' => '0',
        'type' => 'related-page'
    )
);

维护密钥关联并不重要。

好吧,这很难看,但很有效)


使用usort,这里有一个简单的例子。我很确定这个逻辑是正确的,但毫无疑问,还有更好的方法

usort($your_array, function ($elem1, $elem2) {
  if($elem1['type'] == 'related-url')
    return true;

  elseif($elem2['type'] == 'related-url' )
    return false;

  elseif($elem1['type'] == 'related-doc')
    return true;

  else
    return false;
});
如果element1是一个url,它总是返回true;如果不是,而element2是一个url,它总是返回false。如果这两条语句都不是true,并且element1是doc,那么返回true,因为element2是doc或page。最后,如果element1是一个页面,则始终返回false,因为element2是一个文档或页面。

这应该有效

$urls = $docs = $pages = array();
foreach ($array as $sub) {
    switch($sub['type']) {
        case 'related-url':
            $urls[] = $sub;
        break;
        case 'related-doc':
            $docs[] = $sub;
        break;
        case 'related-page':
            $pages[] = $sub;
        break;
   }
}
$result = array_merge($urls, $docs, $pages);
echo '<pre>', var_dump($result), '</pre>';
$url=$docs=$pages=array();
foreach($数组作为$sub){
开关($sub['type'])){
案例“相关url”:
$URL[]=$sub;
打破
案例“相关文件”:
$docs[]=$sub;
打破
案例“相关页面”:
$pages[]=$sub;
打破
}
}
$result=array\u merge($url、$docs、$pages);
echo“”,var_dump($result),“”;
好了

function cmp($a, $b) {

    $sortOrder = array(
        "related-url"   => 1,
        "related-doc"   => 2,
        "related-page"  => 3
    );

    return $sortOrder[$a['type']] - $sortOrder[$b['type']];
}

usort($array, "cmp");
函数cmp($a,$b){
$v1=$a['type'];
$v2=$b['type'];
$v1=str_替换(“相关-”、“”、$v1);
$v2=str_替换(“相关-”、“”、$v2);
$firstChar=abs(ord(substr($v1,0,1))-ord(“u”);
$firstChar2=abs(ord(substr($v2,0,1))-ord(“u”);
返回$firstChar
function cmp($a, $b) {

    $v1 = $a['type'];
    $v2 = $b['type'];   
    $v1 = str_replace("related-", "", $v1);
    $v2 = str_replace("related-", "", $v2); 
    $firstChar = abs(ord(substr($v1,0,1)) - ord("u"));
    $firstChar2 = abs(ord(substr($v2,0,1)) - ord("u"));

    return $firstChar<=$firstChar2?-1:1; 

}

usort ( $array, "cmp" );
function cmp($a, $b) {

    $sortOrder = array(
        "related-url"   => 1,
        "related-doc"   => 2,
        "related-page"  => 3
    );

    return $sortOrder[$a['type']] - $sortOrder[$b['type']];
}

usort($array, "cmp");