'Tom', 'age' => 18 ), array('na"/> 'Tom', 'age' => 18 ), array('na">

Maison  >  Article  >  développement back-end  >  Pourquoi PHP ne parvient-il pas à réorganiser un tableau à deux dimensions ?

Pourquoi PHP ne parvient-il pas à réorganiser un tableau à deux dimensions ?

PHPz
PHPzoriginal
2023-04-18 09:06:09663parcourir

Description du problème

En PHP, pour un tableau bidimensionnel, il est parfois nécessaire de trier selon une certaine valeur clé. Nous utilisons généralement la fonction array_multisort() pour trier, mais dans certains cas, le tri échoue.
Par exemple : il existe un tableau bidimensionnel $arr, qui doit être trié par ordre décroissant en fonction de la valeur clé "name". Le code est le suivant :

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

Cependant, dans certains cas, en utilisant le code ci-dessus. entraînera l'échec du tri. Les raisons et les solutions sont les suivantes : Ce qui suit sera analysé pour tout le monde.

Dépannage

Dans un tel problème, le meilleur moyen est généralement d'imprimer le tableau à trier et d'observer si la valeur de la clé triée n'est pas définie, si le format des données est incorrect ou si d'autres problèmes se produisent. Si le format du tableau imprimé est correct, vous pouvez essayer de déboguer le code.

Ensuite, nous utilisons la fonction var_dump() pour imprimer le tableau $arr et voir :

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

Résultat de sortie :

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

Nous pouvons voir que le format du nom de la clé et de la valeur de la clé est correct, mais pourquoi le tri échouer? ?

Analyse du problème

Nous examinons à nouveau le code ci-dessus et nous pouvons constater que lors de l'utilisation de la fonction array_multisort(), la fonction array_column() est utilisée pour extraire les valeurs clés à trier. Il peut y avoir un problème ici. . La fonction

array_column() peut extraire la valeur correspondant à une certaine clé dans un tableau unidimensionnel, mais si le tableau est multidimensionnel, elle ne traitera que la première dimension comme un tableau unidimensionnel au lieu de convertir l'intégralité tableau multidimensionnel en tableau unidimensionnel. Cela peut conduire à un référencement incorrect des données d'index lors de l'utilisation de la fonction array_multisort(). Ci-dessous, nous expliquons ce problème.

La variable $arr est un tableau à deux dimensions. Nous utilisons la fonction array_column() pour extraire la valeur avec le nom de clé "name". Le résultat est le suivant :

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

Résultat de sortie :

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

Comme indiqué ci-dessus. , nous n'avons obtenu qu'un tableau unidimensionnel, cela entraînera la perte des valeurs correspondant aux autres noms de clés lors du tri. Par conséquent, nous pouvons essayer de convertir le tableau multidimensionnel en un tableau unidimensionnel, puis utiliser la fonction array_multisort() pour trier.

Solution

Il existe deux façons de convertir un tableau multidimensionnel en un tableau unidimensionnel, qui consiste à utiliser la fonction array_walk_recursive() ou foreach() pour parcourir le tableau multidimensionnel. Ici, nous prendrons la fonction array_walk_recursive() comme exemple pour illustrer.

Voyons comment utiliser la fonction array_walk_recursive() pour convertir un tableau multidimensionnel en un tableau unidimensionnel :

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

Le tableau $arr converti ressemble à ceci :

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

Après la conversion du tableau multidimensionnel tableau en un tableau unidimensionnel, nous pouvons réutiliser la fonction array_multisort() pour trier le tableau :

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

Le tableau trié est le suivant :

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

Après avoir terminé la conversion du tableau multidimensionnel, nous réutilisons la fonction array_multisort() pour trier le tableau, et le tri peut être effectué normalement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn