web-dev-qa-db-fra.com

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

Sans foreach , Comment puis-je transformer un tableau comme celui-ci

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

à une chaîne comme celle-ci

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

Je pensais déjà à implode(), mais cela n’implose pas la clé.

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

EDIT: J'ai changé la chaîne


EDIT2/UPDATE: .__ Cette question a été posée il y a longtemps. À ce moment-là, je voulais tout écrire sur une seule ligne afin d'utiliser des opérateurs ternaires et des appels de fonctions intégrés en nid en faveur de foreach. Ce n'était pas une bonne pratique! Écrire un code qui soit lisible, qu’il soit concis ou pas importe peu.

Dans ce cas: mettre le foreach dans une fonction sera beaucoup plus lisible et modulaire que d’écrire sur une ligne (même si toutes les réponses sont bonnes!).

87
tom91136

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)
));
159
Yoshi

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émo

150
stewe

J'ai passé des mesures (100 000 itérations), quel moyen le plus rapide de coller un tableau associatif?

Objectif: Pour obtenir une ligne de 1 000 éléments, au format suivant: "clé: valeur, clé2: valeur2"

Nous avons tableau (par exemple):

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

Test numéro un:

Utilisez http_build_query et str_replace :

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

Temps moyen pour imploser 1000 éléments: 0.00012930955084904

Test numéro deux:

Utilisez array_map et implode :

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:

Utilisez array_walk et implode :

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

Temps moyen pour imploser 1000 éléments: 0.0003874126245348

Test numéro quatre:

Utilisez 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 le meilleur moyen de coller le tableau - utilise http_build_query et str_replace

23
Maxim Tkach

Je voudrais utiliser serialize() ou json_encode().

Bien que cela ne donne pas le résultat exact que vous voulez, il serait beaucoup plus facile d'encoder/stocker/récupérer/décoder plus tard.

7
Madara Uchiha

Utiliser 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

3
Shiplu Mokaddim

Changement 

-    return substr($result, (-1 * strlen($glue)));
+    return substr($result, 0, -1 * strlen($glue));

si vous voulez recevoir la chaîne entière sans le dernier $ colle

function key_implode(&$array, $glue) {
    $result = "";
    foreach ($array as $key => $value) {
        $result .= $key . "=" . $value . $glue;
    }
    return substr($result, (-1 * strlen($glue)));
}

Et l'usage:

$str = key_implode($yourArray, ",");
2
Björn

À des fins de débogage. Récursive écrit un tableau de tableaux imbriqués dans une chaîne . Utilisé pour chaque. Fonction stocke les caractères de langue nationale.

function q($input)
{
    $glue = ', ';
    $function = function ($v, $k) use (&$function, $glue) {
        if (is_array($v)) {
            $arr = [];
            foreach ($v as $key => $value) {
                $arr[] = $function($value, $key);
            }
            $result = "{" . implode($glue, $arr) . "}";
        } else {
            $result = sprintf("%s=\"%s\"", $k, var_export($v, true));
        }
        return $result;
    };
    return implode($glue, array_map($function, $input, array_keys($input))) . "\n";
}
2
Sergey Yurich

Pour créer mysql où les conditions du tableau

$sWheres = array('item1'  => 'object1',
                 'item2'  => 'object2',
                 'item3'  => 1,
                 'item4'  => array(4,5),
                 'item5'  => array('object3','object4'));
$sWhere = '';
if(!empty($sWheres)){
    $sWhereConditions = array();
    foreach ($sWheres as $key => $value){
        if(!empty($value)){
            if(is_array($value)){
                $value = array_filter($value); // For remove blank values from array
                if(!empty($value)){
                    array_walk($value, function(&$item){ $item = sprintf("'%s'", $item); }); // For make value string type 'string'
                    $sWhereConditions[] = sprintf("%s in (%s)", $key, implode(', ', $value));
                }
            }else{
                $sWhereConditions[] = sprintf("%s='%s'", $key, $value);
            }
        }
    }
    if(!empty($sWhereConditions)){
        $sWhere .= "(".implode(' AND ', $sWhereConditions).")";
    }
}
echo $sWhere;  // (item1='object1' AND item2='object2' AND item3='1' AND item4 in ('4', '5') AND item5 in ('object3', 'object4'))
1
Ajay Patidar

Il existe également var_export et print_r plus communément connu pour imprimer les résultats du débogage, mais les deux fonctions peuvent prendre un argument optionnel pour renvoyer une chaîne.

Utiliser l'exemple de la question comme donnée.

$array = ["item1"=>"object1", "item2"=>"object2","item-n"=>"object-n"];

Utiliser print_r pour transformer le tableau en chaîne

Cela produira une représentation lisible par l'homme de la variable.

$string = print_r($array, true);
echo $string;

Est-ce que la sortie:

Array
(
    [item1] => object1
    [item2] => object2
    [item-n] => object-n
)

Utiliser var_export pour transformer le tableau en chaîne

Ce qui produira une représentation sous forme de chaîne php de la variable.

$string = var_export($array, true);
echo $string;

Est-ce que la sortie:

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

Parce que c'est php valide, nous pouvons l'évaluer.

eval('$array2 = ' . var_export($array, true) . ';');
var_dump($array2 === $array);

Les sorties:

bool(true)
0
nickl-

Vous pouvez aussi utiliser PHP array_reduce ,

$a = ['Name' => 'Last Name'];

function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";}

$imploded = array_reduce(array_keys($a), "acc");
0
sapenov

Voici un exemple simple, en utilisant la classe:

$input = array(
    'element1'  => 'value1',
    'element2'  => 'value2',
    'element3' =>  'value3'
);

echo FlatData::flatArray($input,', ', '=');

class FlatData
{

    public static function flatArray(array $input = array(), $separator_elements = ', ', $separator = ': ')
    {
        $output = implode($separator_elements, array_map(
            function ($v, $k, $s) {
                return sprintf("%s{$s}%s", $k, $v);
            },
            $input,
            array_keys($input),
            array_fill(0, count($input), $separator)
        ));
      return $output;
    }

}
0
Ivan Ferrer