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)
St.*_*son 56
使用 usort
usort($array, 'sortByOption');
function sortByOption($a, $b) {
return strcmp($a['optionNumber'], $b['optionNumber']);
}
Run Code Online (Sandbox Code Playgroud)
Pig*_*vel 15
我使用了KennyTM和AJ 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)
使用 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)
| 归档时间: |
|
| 查看次数: |
65268 次 |
| 最近记录: |