私は次の配列構造を持っています:
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
)
)
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
)
)
usort
を使用します。
function cmp_by_optionNumber($a, $b) {
return $a["optionNumber"] - $b["optionNumber"];
}
...
usort($array, "cmp_by_optionNumber");
PHP≥5.3では、代わりに 匿名関数 を使用する必要があります。
usort($array, function ($a, $b) {
return $a['optionNumber'] - $b['optionNumber'];
});
上記のコードは両方とも$a['optionNumber']
は整数です。文字列の場合は、 @ St。John Johnson's solution を使用します。
PHP≥7.0では、 spaceship operator <=>
減算の代わりに、オーバーフロー/切り捨ての問題を防ぎます。
usort($array, function ($a, $b) {
return $a['optionNumber'] <=> $b['optionNumber'];
});
usort
を使用
usort($array, 'sortByOption');
function sortByOption($a, $b) {
return strcmp($a['optionNumber'], $b['optionNumber']);
}
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;
}
_
使用法:
_sortBySubValue($array, 'optionNumber', true, false);
_
編集
最初の部分は 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;
}
_
上記のような機能を使用する場合、キーは削除されます。キーが重要な場合、次の関数がキーを維持しますが、foreachループは非常に非効率的です。
function subval_sort($a,$subkey) {
foreach($a as $k=>$v) {
$b[$k] = strtolower($v[$subkey]);
}
asort($b);
foreach($b as $key=>$val) {
$c[$key] = $a[$key];
}
return $c;
}
$array = subval_sort($array,'optionNumber');
高から低にしたい場合は、asortではなくarsortを使用します。
コードクレジット: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/
PHP 5.3以降
usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
Array_multisort()、array_map()を使用する
array_multisort(array_map(function($element) {
return $element['optionNumber'];
}, $array), SORT_ASC, $array);
print_r($array);