PHP按SubArray值排序数组

Sjw*_*ies 96 php arrays sorting

我有以下数组结构:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )
Run Code Online (Sandbox Code Playgroud)

基于optionNumber以递增方式订购数组的最佳方法是什么?

所以结果如下:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 185

使用usort.

function cmp_by_optionNumber($a, $b) {
  return $a["optionNumber"] - $b["optionNumber"];
}

...

usort($array, "cmp_by_optionNumber");
Run Code Online (Sandbox Code Playgroud)

在PHP≥5.3中,您应该使用匿名函数:

usort($array, function ($a, $b) {
    return $a['optionNumber'] - $b['optionNumber'];
});
Run Code Online (Sandbox Code Playgroud)

请注意,上面的两个代码$a['optionNumber']都是一个整数.使用@St.约翰约翰逊的解决方案,如果他们是字符串.


在PHP≥7.0中,使用太空船操作符<=>而不是减法来防止溢出/截断问题.

usort($array, function ($a, $b) {
    return $a['optionNumber'] <=> $b['optionNumber'];
});
Run Code Online (Sandbox Code Playgroud)

  • 那么他只是给你使用的功能.你必须承认,并不总是有内置的功能来做你想要的,你必须自己写.比较函数只需要返回1,0或-1,表示两个元素的排序顺序. (14认同)
  • 这并没有真正帮助我,因为 usort 要求我提供一个要使用的函数 - 这是我无法理解的困难之处 (2认同)
  • 现在也作为闭包: - usort($ array,function($ a,$ b){return $ b ["optionNumber"] - $ a ["optionNumber"];}); (2认同)

St.*_*son 56

使用 usort

 usort($array, 'sortByOption');
 function sortByOption($a, $b) {
   return strcmp($a['optionNumber'], $b['optionNumber']);
 }
Run Code Online (Sandbox Code Playgroud)

  • @BenSinclair,这是因为肯尼的解决方案是数字,这个解决方案是针对字符串的.他们都是正确的:-) + 1替代. (7认同)

Pig*_*vel 15

我使用了KennyTMAJ Quick的两个解决方案,并提出了一个函数,可以帮助解决这个问题,例如使用ASC或DESC排序或保留键,或者如果你有对象作为数组的子项.

这是这个函数(因为太空飞船运营商而适用于PHP7及更高版本):

/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if ($preserveKeys) {
        $c = [];
        if (is_object(reset($array))) {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v->$value);
            }
        } else {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v[$value]);
            }
        }
        $asc ? asort($b) : arsort($b);
        foreach ($b as $k => $v) {
            $c[$k] = $array[$k];
        }
        $array = $c;
    } else {
        if (is_object(reset($array))) {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
            });
        } else {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
            });
        }
    }

    return $array;
}
Run Code Online (Sandbox Code Playgroud)

用法:

sortBySubValue($array, 'optionNumber', true, false);
Run Code Online (Sandbox Code Playgroud)

编辑

第一部分可以使用重写uasort(),功能会更短(因为宇宙飞船运营商而适用于PHP7及更高版本):

/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if (is_object(reset($array))) {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        });
    } else {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        });
    }
    return $array;
}
Run Code Online (Sandbox Code Playgroud)


Gha*_*iya 5

使用 array_multisort()、array_map()

array_multisort(array_map(function($element) {
      return $element['optionNumber'];
  }, $array), SORT_ASC, $array);

print_r($array);
Run Code Online (Sandbox Code Playgroud)

演示

  • 这非常容易实现。谢谢。我所要做的就是更改我的列名称,它就起作用了。 (2认同)
  • 这也保留了父数组的键 (2认同)