PHP が 2 次元配列の並べ替えに失敗するのはなぜですか?

PHPz
リリース: 2023-04-18 09:27:49
オリジナル
694 人が閲覧しました

問題の説明

PHP では、2 次元配列の場合、特定のキー値に従ってソートする必要がある場合があります。通常、ソートには array_multisort() 関数を使用しますが、場合によっては、ソートに失敗します。
例: 2 次元配列 $arr があり、キー値 "name" に従って降順にソートする必要があります。コードは次のとおりです:

$arr = array(
    array('name' => 'Tom', 'age' => 18),
    array('name' => 'Jerry', 'age' => 20),
    array('name' => 'Bob', 'age' => 25),
    array('name' => 'Alice', 'age' => 22),
);

// 按照'name'进行降序排序
array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);
ログイン後にコピー

ただし、上記のコードを使用すると並べ替えが失敗する場合がありますが、その原因と解決策は何ですか?以下は全員を対象に分析されます。

トラブルシューティング

このような問題の場合、一般に最善の方法は、並べ替える配列を出力し、並べ替えられたキー値が定義されていないのか、データ形式が間違っていないかを観察することです。またはその他の質問。出力された配列の形式が正しい場合は、コードのデバッグを試行できます。

次に、var_dump() 関数を使用して $arr 配列を出力し、次のことを確認します。

// 打印一下原数组,查看键名和键值
var_dump($arr);
ログイン後にコピー

出力結果:

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(3) "Tom"
    ["age"]=>
    int(18)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(5) "Jerry"
    ["age"]=>
    int(20)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["age"]=>
    int(25)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["age"]=>
    int(22)
  }
}
ログイン後にコピー

キー名とキーがvalue 形式は正しいのに、並べ替えが失敗するのはなぜですか?

問題分析

上記のコードをもう一度見てみると、array_multisort() 関数を使用するときに、array_column() 関数を使用してキー値を抽出していることがわかります。整理する必要があります。ここに質問がある可能性があります。

array_column() 関数は、1 次元配列内のキー名に対応する値を抽出できますが、配列が多次元の場合は、最初の次元のみを 1 次元配列として扱います。多次元配列全体 配列を 1 次元配列に変換します。これにより、array_multisort() 関数の使用時にインデックス データが誤って参照される可能性があります。以下にこの問題について説明します。

変数 $arr は 2 次元配列です。array_column() 関数を使用して、キー名「name」の値を抽出します。結果は次のようになります:

// 提取出键名为'name'的值
$name = array_column($arr, 'name');
var_dump($name);
ログイン後にコピー

出力結果:

array(4) {
  [0]=>
  string(3) "Tom"
  [1]=>
  string(5) "Jerry"
  [2]=>
  string(3) "Bob"
  [3]=>
  string(5) "Alice"
}
ログイン後にコピー

上に示したように、1 次元配列のみが取得されるため、ソート中に他のキー名に対応する値が失われます。したがって、多次元配列を 1 次元配列に変換し、array_multisort() 関数を使用して並べ替えることができます。

解決策

多次元配列を 1 次元配列に変換するには 2 つの方法があります。array_walk_recursive() 関数を使用するか、foreach() を使用して複数の配列をループする方法です。次元配列。ここでは、array_walk_recursive() 関数を例として説明します。

array_walk_recursive() 関数を使用して多次元配列を 1 次元配列に変換する方法を見てみましょう:

// 定义一个函数将多维数组转换为一维数组
function array_multi2single(&$data){
    static $result_array = array();
    array_walk_recursive($data, function($value, $key) use(&$result_array){
        $result_array[$key] = $value;
    });
    $data = $result_array;
}

// 将多维数组转换为一维数组
array_multi2single($arr);
ログイン後にコピー

変換された $arr 配列は次のとおりです:

array(8) {
  ["name"]=>
  string(5) "Alice"
  ["age"]=>
  int(22)
  [0]=>
  string(3) "Tom"
  [1]=>
  string(5) "Jerry"
  [2]=>
  string(3) "Bob"
  [3]=>
  string(5) "Alice"
  [4]=>
  int(18)
  [5]=>
  int(20)
}
ログイン後にコピー

多次元配列を 1 次元配列に変換した後、array_multisort() 関数を再利用して配列を並べ替えることができます:

// 将多维数组转换为一维数组
array_multi2single($arr);
// 按照'name'进行降序排序
array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);
ログイン後にコピー

並べ替えられた配列は次のようになります:

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "Jerry"
    ["age"]=>
    int(20)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["age"]=>
    int(25)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["age"]=>
    int(22)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(3) "Tom"
    ["age"]=>
    int(18)
  }
}
ログイン後にコピー

多次元配列の変換完了後 その後、array_multisort() 関数を再利用して配列をソートすると、ソートは正常に進むようになります。

以上がPHP が 2 次元配列の並べ替えに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート