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!).
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)
));
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
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
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.
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);
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, ",");
À 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";
}
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'))
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"];
print_r
pour transformer le tableau en chaîneCela 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
)
var_export
pour transformer le tableau en chaîneCe 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)
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");
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;
}
}