Question

Dites par exemple que vous venez d'interroger une base de données et que vous avez reçu ce tableau 2D.

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);

Je me retrouve souvent à écrire des boucles comme celle-ci.

foreach($results as $result)
    $names[] = $result['name'];

Ma question est la suivante: existe-t-il un moyen d’obtenir ce tableau $ noms sans utiliser de boucle? Utiliser les fonctions de rappel compte comme une boucle.

Voici un exemple plus générique d'obtention de tous les champs.

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;
Était-ce utile?

La solution

À compter du 20 juin, PHP-5.5 comportait une nouvelle fonction array_column

.

Par exemple:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe'
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith'
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones'
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe'
    )
);


$firstNames = array_column($records, 'first_name');
print_r($firstNames);

reviendra

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Il y a encore plus d'exemples dans le lien mentionné ci-dessus.

Autres conseils

J'ai voté en faveur de la réponse de @ Devon parce qu'il n'y a pas vraiment de moyen de faire ce que vous demandez avec une fonction intégrée. Le mieux que vous puissiez faire est d’écrire le vôtre:

function array_column($array, $column)
{
    $ret = array();
    foreach ($array as $row) $ret[] = $row[$column];
    return $ret;
}

À partir de PHP 5.3, vous pouvez utiliser ce bel appel avec la fonction lambda:

$names = array_map(function ($v){ return $v['name']; }, $results);

Ceci retournera un tableau découpé en tranches par la dimension 'name'.

En termes simples, non.

Vous devrez utiliser une boucle ou une fonction de rappel telle que array_walk .

J'ai effectué d'autres recherches à ce sujet et découvert que ruby ??et son prototype avaient tous deux une fonction appelée array_pluck , 2 . Il est intéressant de noter que array_map a une deuxième utilisation qui vous permet de faire l'inverse de ce que je veux faire ici. J'ai également trouvé un classe de PHP écrit par quelqu'un pour émuler des prototypes de manipulation de tableaux.

Je vais faire quelques recherches supplémentaires et si je ne trouve rien d’autre, je travaillerai sur un correctif que je soumettrai à la liste de diffusion internals@lists.php.net pour voir s’ils ajouteraient array_pluck.

Pour ceux d'entre vous qui ne peuvent pas passer à PHP5.5 et ont besoin de cette fonction, voici une implémentation de array_column .

function array_column($array, $column){
    $a2 = array();
    array_map(function ($a1) use ($column, &$a2){
        array_push($a2, $a1[$column]);
    }, $array);
    return $a2;
}

Si vous utilisez une version de PHP antérieure à 5.5 et que array_column () , vous pouvez utiliser le remplacement officiel en langage PHP brut:

https://github.com/ramsey/array_column

Je pense que cela fera ce que vous voulez

array_uintersect_uassoc

Vous devez faire quelque chose comme ceci

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value')  , 0, "cmpKey");
print_r($name);

//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
  if ($key1 == $key2) {
    return 0;
  } else {
    return -1;
  }
}

Cependant, je n'ai pas accès à PHP5, je ne l'ai donc pas testé.

Vous pourriez faire:

$tmp = array_flip($names);
$names = array_keys($tmp);

Ceci est une alternative rapide à la fonction array_column ()

if(!function_exists('array_column')) {
    function array_column($element_name) {
        $ele =   array_map(function($element) {
            return $element[$element_name];
        }, $a);
        return  $ele;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top