問題の説明
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 サイトの他の関連記事を参照してください。