Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann PHP ein zweidimensionales Array nicht neu anordnen?

Warum kann PHP ein zweidimensionales Array nicht neu anordnen?

PHPz
PHPzOriginal
2023-04-18 09:06:09696Durchsuche

Problembeschreibung

In PHP ist es manchmal notwendig, nach einem bestimmten Schlüsselwert zu sortieren. Normalerweise verwenden wir zum Sortieren die Funktion array_multisort(), aber in einigen Fällen schlägt die Sortierung fehl.
Zum Beispiel: Es gibt ein zweidimensionales Array $arr, das in absteigender Reihenfolge nach dem Schlüsselwert „Name“ sortiert werden muss. Der Code lautet wie folgt:

$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);

In einigen Fällen wird jedoch der obige Code verwendet führt dazu, dass die Sortierung fehlschlägt. Die Gründe und Lösungen sind: Was? Das Folgende wird für alle analysiert.

Fehlerbehebung

Bei einem solchen Problem ist es im Allgemeinen am besten, das zu sortierende Array auszudrucken und zu beobachten, ob der sortierte Schlüsselwert nicht definiert ist, das Datenformat falsch ist oder andere Probleme vorliegen. Wenn das Format des gedruckten Arrays korrekt ist, können Sie versuchen, den Code zu debuggen.

Als nächstes verwenden wir die Funktion var_dump(), um das $arr-Array zu drucken und sehen:

// 打印一下原数组,查看键名和键值
var_dump($arr);

Ausgabeergebnis:

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)
  }
}

Wir können sehen, dass das Format des Schlüsselnamens und des Schlüsselwerts korrekt ist, aber warum erfolgt die Sortierung? scheitern? ?

Problemanalyse

Wir schauen uns den obigen Code noch einmal an und stellen fest, dass bei Verwendung der Funktion array_multisort() die Funktion array_column() zum Extrahieren der zu sortierenden Schlüsselwerte verwendet wird. Hier liegt möglicherweise ein Problem vor . Die Funktion

array_column() kann den Wert extrahieren, der einem bestimmten Schlüssel in einem eindimensionalen Array entspricht. Wenn das Array jedoch mehrdimensional ist, wird nur die erste Dimension als eindimensionales Array behandelt, anstatt das gesamte Array zu konvertieren mehrdimensionales Array in ein eindimensionales Array. Dies kann dazu führen, dass Indexdaten bei Verwendung der Funktion array_multisort() falsch referenziert werden. Nachfolgend erläutern wir dieses Problem.

Die Variable $arr ist ein zweidimensionales Array, um den Wert mit dem Schlüsselnamen „name“ zu extrahieren:

// 提取出键名为'name'的值
$name = array_column($arr, 'name');
var_dump($name);

Wie oben gezeigt , wir haben nur ein eindimensionales Array erhalten, was dazu führt, dass die Werte, die anderen Schlüsselnamen entsprechen, beim Sortieren verloren gehen. Daher können wir versuchen, das mehrdimensionale Array in ein eindimensionales Array umzuwandeln und dann die Funktion array_multisort() zum Sortieren verwenden.

Lösung

Es gibt zwei Möglichkeiten, ein mehrdimensionales Array in ein eindimensionales Array umzuwandeln, nämlich die Funktion array_walk_recursive() oder foreach() zum Durchlaufen des mehrdimensionalen Arrays zu verwenden. Hier nehmen wir zur Veranschaulichung die Funktion array_walk_recursive() als Beispiel.

Sehen wir uns an, wie man mit der Funktion array_walk_recursive() ein mehrdimensionales Array in ein eindimensionales Array umwandelt:

array(4) {
  [0]=>
  string(3) "Tom"
  [1]=>
  string(5) "Jerry"
  [2]=>
  string(3) "Bob"
  [3]=>
  string(5) "Alice"
}

Das konvertierte $arr-Array sieht so aus:

// 定义一个函数将多维数组转换为一维数组
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);

Nach der Konvertierung des mehrdimensionalen Array in ein eindimensionales Array umgewandelt haben, können wir die Funktion array_multisort() wiederverwenden, um das Array zu sortieren:

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)
}

Das sortierte Array sieht wie folgt aus:

// 将多维数组转换为一维数组
array_multi2single($arr);
// 按照'name'进行降序排序
array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);

Nach Abschluss der mehrdimensionalen Array-Konvertierung verwenden wir die Funktion array_multisort() wieder Um das Array zu sortieren, kann die Sortierung zu diesem Zeitpunkt normal durchgeführt werden.

Das obige ist der detaillierte Inhalt vonWarum kann PHP ein zweidimensionales Array nicht neu anordnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Warum durchläuft PHP Arrays?Nächster Artikel:Warum durchläuft PHP Arrays?