web-dev-qa-db-ja.com

PHP SubArray値で配列をソート

私は次の配列構造を持っています:

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
                )
    )
95
Sjwdavies

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'];
});
180
kennytm

usortを使用

 usort($array, 'sortByOption');
 function sortByOption($a, $b) {
   return strcmp($a['optionNumber'], $b['optionNumber']);
 }
56

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

使用法:

_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;
}
_
14
Pigalev Pavel

上記のような機能を使用する場合、キーは削除されます。キーが重要な場合、次の関数がキーを維持しますが、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/

4
AJ Quick

PHP 5.3以降

usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
3
Samer Ata

Array_multisort()、array_map()を使用する

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

print_r($array);

[〜#〜] demo [〜#〜]

0