Php 如何按值对多维数组排序

Php 如何按值对多维数组排序,php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,如何根据“order”键的值对该数组进行排序 尽管这些值当前是连续的,但它们并不总是连续的 Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) [1] => Array (

如何根据“order”键的值对该数组进行排序

尽管这些值当前是连续的,但它们并不总是连续的

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
)
我使用此功能:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key => $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}

array_sort_by_column($array, 'order');
usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});
我通常使用,并通过我自己的比较功能。在这种情况下,非常简单:

function compareOrder($a, $b)
{
  return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');
在PHP 7中,使用spaceship操作符:

usort($array, function($a, $b) {
    return $a['order'] <=> $b['order'];
});
usort($array,function($a,$b){
返回$a['order']$b['order'];
});
试试看。如果您仍然使用PHP 5.2或更早版本,则必须首先定义排序函数:

function sortByOrder($a, $b) {
    return $a['order'] - $b['order'];
}

usort($myArray, 'sortByOrder');
从PHP 5.3开始,您可以使用匿名函数:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key => $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}

array_sort_by_column($array, 'order');
usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});
最后,对于PHP 7,您可以使用:

usort($myArray,function($a,$b){
返回$a['order']$b['order'];
});
要将其扩展到多维排序,请参考第二个/第三个排序元素(如果第一个为零)-最好在下面解释。您还可以使用它对子元素进行排序

usort($myArray, function($a, $b) {
    $retval = $a['order'] <=> $b['order'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});
usort($myArray,function($a,$b){
$retval=$a['order']$b['order'];
如果($retval==0){
$retval=$a['suborder']$b['suborder'];
如果($retval==0){
$retval=$a['details']['subsuborder']$b['details']['subsuborder'];
}
}
返回$retval;
});
如果需要保留密钥关联,请使用
uasort()
-请参阅手册中的

$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

这将同时处理大写和小写字母。

要根据“title”键的值对数组进行排序,请使用:

uasort($myArray, function($a, $b) {
    return strcmp($a['title'], $b['title']);
});
strcmp比较字符串

uasort()按照定义维护数组键。

让我们面对现实:PHP没有一个简单的现成函数来正确处理每个数组排序场景

此例程直观,意味着更快的调试和维护:

// Automatic population of the array
$tempArray = array();
$annotations = array();
// ... some code
// SQL $sql retrieves result array $result
// $row[0] is the ID, but is populated out of order (comes from
// multiple selects populating various dimensions for the same DATE
// for example
while($row = mysql_fetch_array($result)) {
    $needle = $row[0];
    arrayIndexes($needle);  // Create a parallel array with IDs only
    $annotations[$needle]['someDimension'] = $row[1]; // Whatever
}
asort($tempArray);
foreach ($tempArray as $arrayKey) {
    $dataInOrder = $annotations[$arrayKey]['someDimension'];
    // .... more code
}

function arrayIndexes ($needle) {
    global $tempArray;
    if (!in_array($needle, $tempArray)) {
        array_push($tempArray, $needle);
    }
}

实现这一目标的一种方法是这样

$new = [
    [
        'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
        'title' => 'Flower',
        'order' => 3,
    ],
    [
        'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
        'title' => 'Free',
        'order' => 2,
    ],
    [
        'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
        'title' => 'Ready',
        'order' => 1,
    ],
];
$keys = array_column($new, 'order');
array_multisort($keys, SORT_ASC, $new);
var_dump($new);
结果:

Array
(
    [0] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )
    [2] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )
)

最灵活的方法是使用以下方法:

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
原因如下:

  • 您可以按任意键进行排序(也可以嵌套,如
    'key1.key2.key3'
    ['k1','k2','k3']

  • 它同时适用于关联数组和非关联数组(
    $assoc
    标志)

  • 它不使用引用-它返回一个新的排序数组

在您的情况下,它将非常简单:

$sortedArray = Arr::sortByKeys($array, 'order');
此方法是。

使用
array\u multisort()
array\u map()


如果有人需要根据键进行排序,最好使用以下选项:

usort($array, build_sorter('order'));

function build_sorter($key) {
   return function ($a, $b) use ($key) {
      return strnatcmp($a[$key], $b[$key]);
   };
}
此解决方案适用于usort(),具有易于记忆的多维排序符号。使用spaceship操作符,可从PHP7获得

usort($in,function($a,$b){
  return $a['first']   <=> $b['first']  //first asc
      ?: $a['second']  <=> $b['second'] //second asc
      ?: $b['third']   <=> $a['third']  //third desc (a b swapped!)
      //etc
  ;
});
第一个任务:按等级asc排序,姓氏asc

usort($in,function($a,$b){
  return $a['rank']      <=> $b['rank']     //first asc
      ?: $a['surname']   <=> $b['surname']  //second asc
  ;
});
usort($in,function($a,$b){
返回$a['rank']$b['rank']//第一个asc
?:$a['姓氏]$b['姓氏]//第二个asc
;
});
第二项任务:按等级描述、姓氏asc、firstmame asc排序

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //first desc
      ?: $a['surname']   <=> $b['surname']    //second asc
      ?: $a['firstname'] <=> $b['firstname']  //third asc
  ;
});
usort($in,function($a,$b){
返回$b['rank']$a['rank']//第一个描述
?:$a['姓氏]$b['姓氏]//第二个asc
?:$a['firstname']$b['firstname']//第三个asc
;
});
第三项任务:按等级描述、出生日期asc排序

日期不能按此符号排序。它是用strottime转换的

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //first desc
      ?: strtotime($a['birthdate']) <=> strtotime($b['birthdate'])    //second asc
  ;
});
usort($in,function($a,$b){
返回$b['rank']$a['rank']//第一个描述
?:strotime($a['birthdate'])strotime($b['birthdate'])//第二个asc
;
});

您可以使用
usort
和带有回调函数的用户定义排序函数:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key => $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}

array_sort_by_column($array, 'order');
usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});
usort($new,fn($a,$b)=>a['order']-$b['order']);

技巧:您可以使用
a>b
a-b
ab
进行升序排序。对于降序排列,只需将
a
b

的交换位置交叉链接:最快的方法是使用同构模块,该模块在浏览器和节点中都可以本地工作,支持任何类型的输入,计算字段和自定义排序顺序。这如何回答按特定数组键排序的问题?@Nitro此答案缺少教育性解释。这个答案似乎是对另一个问题的正确答案。“让我们面对现实:php没有一个简单的开箱即用的函数来正确处理每个数组排序场景。”这正是usort/ksort/asort为^^而设计的,实际上PHP可以用来处理每一个数组排序场景。关于调试和维护,使用
global
是一个巨大的危险信号,而且非常重要。为什么针对这个问题演示的是
mysql\u fetch\u array
,而不是OP的源数组,并且没有解释您的代码在做什么以及预期的结果是什么?总的来说,这是一种非常复杂的方法来实现预期的最终结果。@tonygil我无法从你的答案和OP的数据集中确定你的预期结果。这对你来说可能很明显,但我不知道你的答案如何回答OP的问题。但是,您可以不使用
global
请参见:这将生成一个显式定义的变量,而不是一个可以全局更改和访问的变量。请注意,这种方法将发出通知
array\u multisort
引用了它的第一个参数。@Kami在现成的演示链接中没有证据表明您的声明。我不会使用这个答案,因为
array\u column()
更合适/简洁。这是ajuchacko91先前发布的答案的一个不太精炼的版本。基于示例4,这个答案缺少教育性解释。一个循环,然后是本机排序,然后是另一个循环?当然不是页面上最优雅或最有表现力的片段。应该有一个解释。这个答案缺少教育性的解释。应该有一个解释。例如,想法/要点是什么?与其他解决方案相比,折衷方案是什么?性能特点是什么