PHP - 通过保留原始数组键,按子数组值对数组进行排序

3
我想按其子数组值(“名称”)对一个数组进行排序,但保留其原始数组键。
默认数组:
Array (
    [251] => Array
        (
            [color] => 
            [name] => 8
            [nbr] => 1
            [url_name] => taille-8
            [meta_title] => 
        )

    [323] => Array
        (
            [color] => 
            [name] => 7
            [nbr] => 2
            [url_name] => taille-7
            [meta_title] => 
        )

    [127] => Array
        (
            [color] => 
            [name] => 34
            [nbr] => 2
            [url_name] => taille-34
            [meta_title] => 
        )
);

通过使用array_multisort,我可以得到以下数组:
Array(
    [0] => Array
        (
            [color] => 
            [name] => 7
            [nbr] => 2
            [url_name] => taille-7
            [meta_title] => 
        )

    [1] => Array
        (
            [color] => 
            [name] => 8
            [nbr] => 1
            [url_name] => taille-8
            [meta_title] => 
        )

    [2] => Array
        (
            [color] => 
            [name] => 34
            [nbr] => 2
            [url_name] => taille-34
            [meta_title] => 
        )
);

但我需要的是,
Array(
    [323] => Array
        (
            [color] => 
            [name] => 7
            [nbr] => 2
            [url_name] => taille-7
            [meta_title] => 
        )

    [251] => Array
        (
            [color] => 
            [name] => 8
            [nbr] => 1
            [url_name] => taille-8
            [meta_title] => 
        )

    [127] => Array
        (
            [color] => 
            [name] => 34
            [nbr] => 2
            [url_name] => taille-34
            [meta_title] => 
        )
);

感谢提前:)

检查 usort 函数 - jitendrapurohit
请添加 array_multisort 代码 - Noman
4个回答

2

1
"

$arr 是你的数组:

"
//obtain list of values to sort by
foreach ($arr as $id => $value) {
    $names[$id] = $value['name'];
}
$keys = array_keys($arr);
array_multisort(
    $names, SORT_ASC, SORT_NUMERIC, $arr, $keys
);
$result = array_combine($keys, $arr);

你可能错过了最后一步,将数组与给定的键组合。

我已经检查了你的代码,没有得到结果。 - Narayan Bhandari
1
@NarayanBhandari 请再次检查:http://sandbox.onlinephpfunctions.com/code/ce77839c6d484a07796cec18ef2a5a3ba17fcd4d - Jan Holas

1

$arr 假设您的数组包含数字键,并使用 array_multisort 进行排序。

array_multisort 将返回已排序的数组。
array_combine 将组合原始键和排序后的数组。

用法:

$result = array_sort_by_column_preserve_keys($arr);
echo '<pre>';print_r($result);echo '</pre>';

Method :

function array_sort_by_column_preserve_keys($arr) {
    $ar2 = [];
    foreach($arr as $key => $sub) {
        $ar2[ $key ] = $sub;
    }
    $keys = array_keys($arr);
    array_multisort($ar2, SORT_ASC, SORT_NUMERIC, $arr, $keys);
    return $result = array_combine($keys, $arr);
}

你本可以编辑我的回答,因为它基本上是一样的。 - Jan Holas

0
请尝试这个,

$array=array(
    "251" => array(
        "color" => "",
        "name" => 8,
        "nbr" => 1,
        "url_name" => "taille-8",
        "meta_title" => ""),

    "323" => array(
        "color" => "",
        "name" => 7,
        "nbr" => 2,
        "url_name" => "taille-7",
        "meta_title" => ""),
    "127" => array(
        "color" => "",
        "name" => 34,
        "nbr" => 2,
        "url_name" => "taille-34",
        "meta_title" => ""),
    );
function swapArray( &$arr,$firstPos,$secondPos){
    //echo PHP_EOL."swap: ".$firstPos.", ".$secondPos.PHP_EOL;
    foreach($arr[$firstPos] as $k=>$v){
        //echo PHP_EOL.$k." => ".$v.PHP_EOL;
        $tmp=$v;
        $arr[$firstPos][$k]=$arr[$secondPos][$k];
        $arr[$secondPos][$k]=$tmp;
    }
}
    var_dump($array);

    $keys=array(); // store all key values
    $num=count($array);

    foreach($array as $key=>$tmpArray)
        $keys[]=$key;

    //var_dump($keys);

    for($i=0; $i<$num; $i++){
        for($j=$i+1; $j<$num; $j++){
            if($array[$keys[$i]]["name"]>$array[$keys[$j]]["name"]){
                swapArray($array,$keys[$i],$keys[$j]);
            }
        }
    }


    var_dump($array);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接