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 !).

4voto

sapenov Points 1241

Vous pouvez utiliser la fonction réduction_de_tableaux également,

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

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

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

3voto

Björn Points 15485

Changer

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

si vous voulez résumer toute la chaîne sans la dernière $glue

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, ",");

3voto

Sergey Yurich Points 31

À des fins de débogage. Écriture récursive d'un tableau de tableaux imbriqués dans une chaîne de caractères. Utilisé avec foreach. La fonction stocke les caractères de la 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";
}

3voto

Ivan Ferrer Points 325

Voici un exemple simple, 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;
    }

}

3voto

nickl- Points 1772

Il y a aussi var_export y print_r plus connue pour l'impression de la sortie de débogage, mais les deux fonctions peuvent prendre un argument optionnel pour renvoyer une chaîne de caractères à la place.

En utilisant l'exemple de la question comme données.

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

Utilisation print_r pour transformer le tableau en une chaîne de caractères

Cela permet d'obtenir une représentation de la variable lisible par l'homme.

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

Sortie de secours :

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

Utilisation var_export pour transformer le tableau en une chaîne de caractères

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

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

Sortie de secours :

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

C'est parce qu'il est valide que nous pouvons l'évaluer.

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

Sorties :

bool(true)

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