149 votes

Comment imploser un tableau avec une clé et une valeur sans foreach en PHP

Sans foreach , Comment puis-je transformer un tableau comme ceci

array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n");

en une chaîne de caractères comme suit

item1='object1', item2='object2',.... item-n='object-n'

J'ai pensé à implode() déjà, mais elle ne fait pas imploser la clé avec elle.

Si le foreach est nécessaire, est-il possible de ne pas imbriquer le foreach ?

EDIT : J'ai modifié la chaîne de caractères


EDIT2/UPDATE : Cette question a été posée il y a un certain temps déjà. À l'époque, je voulais tout écrire en une seule ligne, j'utilisais donc des opérateurs ternaires et je nichais des appels de fonctions intégrés en faveur de foreach. Ce n'était pas une bonne pratique ! Il faut écrire un code lisible, qu'il soit concis ou non n'a pas beaucoup d'importance.

Dans ce cas : placer le foreach dans une fonction sera beaucoup plus lisible et modulaire que d'écrire un one-liner (même si toutes les réponses sont excellentes !).

255voto

stewe Points 14623

Vous pouvez utiliser http_build_query comme ceci :

<?php
  $a=array("item1"=>"object1", "item2"=>"object2");
  echo http_build_query($a,'',', ');
?>

Sortie :

item1=object1, item2=object2 

Démonstration

214voto

Yoshi Points 25790

Et d'une autre manière :

$input = array(
    'item1'  => 'object1',
    'item2'  => 'object2',
    'item-n' => 'object-n'
);

$output = implode(', ', array_map(
    function ($v, $k) {
        if(is_array($v)){
            return $k.'[]='.implode('&'.$k.'[]=', $v);
        }else{
            return $k.'='.$v;
        }
    }, 
    $input, 
    array_keys($input)
));

ou :

$output = implode(', ', array_map(
    function ($v, $k) { return sprintf("%s='%s'", $k, $v); },
    $input,
    array_keys($input)
));

56voto

Maxim Tkach Points 1126

J'ai passé des mesures (100000 itérations), quelle est la façon la plus rapide de coller un tableau associatif ?

Objectif : Pour obtenir une ligne de 1 000 articles, dans ce format : "clé:valeur,clé2:valeur2"

Nous disposons d'un tableau (par exemple) :

$array = [
    'test0' => 344,
    'test1' => 235,
    'test2' => 876,
    ...
];

Test numéro un :

Utilisation http_build_query y str_replace :

str_replace('=', ':', http_build_query($array, null, ','));

Temps moyen pour imploser 1000 éléments : 0.00012930955084904

Deuxième test :

Utilisation tableau_map y imploser :

implode(',', array_map(
        function ($v, $k) {
            return $k.':'.$v;
        },
        $array,
        array_keys($array)
    ));

Temps moyen pour imploser 1000 éléments : 0.0004890081976675

Test numéro trois :

Utilisation array_walk y imploser :

array_walk($array,
        function (&$v, $k) {
            $v = $k.':'.$v;
        }
    );
implode(',', $array);

Temps moyen pour imploser 1000 éléments : 0.0003874126245348

Test numéro quatre :

Utilisation foreach :

    $str = '';
    foreach($array as $key=>$item) {
        $str .= $key.':'.$item.',';
    }
    rtrim($str, ',');

Temps moyen pour imploser 1000 éléments : 0.00026632803902445

Je peux conclure que la meilleure façon de coller le tableau est d'utiliser http_build_query et str_replace.

14voto

Second Rikudo Points 59550

J'utiliserais serialize() o json_encode() .

Bien que cela ne vous donne pas la chaîne de résultats exacte que vous souhaitez, il serait beaucoup plus facile de l'encoder, de la stocker, de la récupérer et de la décoder par la suite.

4voto

shiplu.mokadd.im Points 28895

Utilisation array_walk

$a = array("item1"=>"object1", "item2"=>"object2","item-n"=>"object-n");
$r=array();
array_walk($a, create_function('$b, $c', 'global $r; $r[]="$c=$b";'));
echo implode(', ', $r);

IDEONE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X