【问题标题】:PHP - Sort Array By SubArray Value By Maintaining original Array keyPHP - 通过维护原始数组键按子数组值对数组进行排序
【发布时间】:2016-09-20 08:51:41
【问题描述】:

我想使用其子数组值(“名称”)对数组进行排序,但保留其原始数组键。

默认数组:

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

感谢广告 :)

【问题讨论】:

  • 检查排序功能
  • 请加array_multisort代码

标签: php sorting multidimensional-array


【解决方案1】:

我会选择uasort,它看起来更简单:

// $arr is your Array
uasort($arr, function ($a, $b) {
  return $a['name'] - $b['name'];
});

这里是一个例子:http://sandbox.onlinephpfunctions.com/code/a9f2d1e9702834b3a35206125429739222770301

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

    array_multisort 将返回排序后的数组。
    array_combine 会将您的原始键与排序数组结合起来。

    用途:

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

    方法:

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

    【讨论】:

    • 你可以编辑我的答案,因为它基本上是一样的。
    【解决方案4】:

    请试试这个,

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

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2020-01-27
      • 2012-06-15
      相关资源
      最近更新 更多