Position actuelle: Accueil> Derniers articles> Un piège pour mélanger les tableaux (des tableaux partiellement, en partie des objets) en utilisant Array_Column

Un piège pour mélanger les tableaux (des tableaux partiellement, en partie des objets) en utilisant Array_Column

M66 2025-04-28

Dans PHP, Array_Column est une fonction couramment utilisée qui peut extraire la valeur d'une colonne d'un tableau multidimensionnel. Normalement, Array_Column fonctionne bien lorsque vous traitez des tableaux purs, mais l'utilisation de Array_Column peut rencontrer des problèmes lorsque les éléments d'un tableau sont de types mixtes (c'est-à-dire que la pièce est un tableau, la partie est un objet).

1. Utilisation de base de la fonction Array_Column

L'utilisation de base de la fonction Array_Column est la suivante:

 array_column(array $input, mixed $column_key, mixed $index_key = null): array
  • $ Entrée : le tableau d'entrée multidimensionnel.

  • $ Column_Key : la clé de la colonne qui doit être extraite (nom de clé du tableau ou nom d'attribut de l'objet).

  • $ index_key : facultatif, utilisé pour spécifier le nom de la clé comme tableau de résultat de retour.

Par exemple, si nous avons un tableau simple:

 $data = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie']
];
$names = array_column($data, 'name');
print_r($names);

Le résultat de la sortie sera:

 Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)

2. Problèmes dans les tableaux mixtes

Le problème peut survenir lorsque nous passons un tableau mixte à Array_Column , c'est-à-dire que le tableau contient à la fois des tableaux et des objets. Par exemple, supposons que nous ayons le tableau mixte suivant:

 $data = [
    ['id' => 1, 'name' => 'Alice'],
    (object)['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie']
];

À ce stade, lorsque nous essayons d'extraire la colonne de nom avec Array_Column , nous rencontrons des problèmes:

 $names = array_column($data, 'name');
print_r($names);

La sortie en ce moment pourrait être:

 Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)

La racine du problème

Une prémisse importante de Array_Column est que les éléments d'un tableau doivent avoir la même structure. Si les éléments d'un tableau contiennent à la fois un tableau et un objet, Array_Column trouvera la colonne cible basée sur la structure du tableau et les propriétés de l'objet. Cependant, en PHP, les tableaux et les objets sont accessibles différemment:

  • La méthode d'accès des tableaux se situe via des noms de clés (tels que $ array ['key'] ).

  • La méthode d'accès des objets se situe via des propriétés (telles que $ objet-> propriété ).

Lorsqu'un objet est inclus dans un tableau mixte, Array_Column ne peut pas trouver les propriétés de l'objet uniformément, entraînant une valeur de retour incomplète ou lancer une erreur.

3. Solution

Pour résoudre ce problème, nous pouvons gérer les tableaux mixtes de la manière suivante:

3.1 Structure de réseau unifié

Le moyen le plus simple est d'unifier tous les éléments dans un tableau ou un objet au lieu de les mélanger. Par exemple, convertissez tous les objets en un tableau:

 $data = [
    ['id' => 1, 'name' => 'Alice'],
    (object)['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie']
];

// Convertir des objets en tableau
foreach ($data as &$item) {
    if (is_object($item)) {
        $item = (array)$item;
    }
}

$names = array_column($data, 'name');
print_r($names);

Cela sortira correctement:

 Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)
3.2 Extraire les propriétés des objets à l'aide de fonctions personnalisées

Si la structure ne peut pas être unifiée, vous pouvez utiliser des fonctions personnalisées pour gérer les éléments du type d'objet. Par exemple:

 function get_name($item) {
    if (is_object($item)) {
        return $item->name;
    }
    return $item['name'];
}

$data = [
    ['id' => 1, 'name' => 'Alice'],
    (object)['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie']
];

$names = array_map('get_name', $data);
print_r($names);

Cette méthode garantit que l'attribut de nom peut être extrait correctement, que l'élément soit un tableau ou un objet.

4. Résumé

Array_Column est un outil puissant, mais il rencontre des problèmes lorsqu'il s'agit de tableaux mixtes, en particulier lorsque les éléments du tableau sont des combinaisons de tableaux et d'objets. Pour éviter les erreurs, il est préférable de s'assurer que les types d'éléments de tableau sont unifiés lors de l'utilisation d'Array_Column , ou de traiter différents types de données par d'autres moyens. Grâce à ces méthodes, nous pouvons mieux utiliser la fonction Array_Column pour éviter les problèmes causés par des structures de données incohérentes.

J'espère que cet article vous aide! Si vous avez plus de questions, veuillez continuer à en discuter!