Array to String PHP?

284

Quelle est la meilleure méthode pour convertir un tableau PHP en chaîne?
J'ai la variable $typequi est un tableau de types.

$type = $_POST[type];

Je veux le stocker comme une chaîne unique dans ma base de données avec chaque entrée séparée par |:

Sports | Festivals | Autre

Philip Kirkbride
la source
24
Veuillez vous abstenir d'insérer des valeurs sérialisées dans une base de données. Voici pourquoi: stackoverflow.com/questions/7364803/…
NullUserException
14
@NullUserException ఠ_ఠ Je suis d'accord que l'insertion de valeurs sérialisées dans la base de données brûle absolument les yeux, mais vous ne connaissez pas sa situation - cela peut très bien être justifié.
AngryHacker
4
Je pense que cette question devrait être rouverte. C'est une question utile pour les débutants et je ne pense pas que ce soit hors sujet.
SaidbakR
1
que faire si certaines des valeurs du tableau ont des caractères |
2014
Vous pouvez ensuite échapper à ces personnages. Lisez-le ici. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Réponses:

353

Utiliser imploser

implode("|",$type);
Niet l'Absolu Noir
la source
13
C'est bien sauf si vous avez des tableaux imbriqués - ce qui peut arriver $_POSTsi vous utilisez des entrées de formulaire nommées par tableau.
Leith
avec des tableaux imbriqués, utilisez simplement un foreach, cela fonctionnera.
deepcell
225

Vous pouvez utiliser json_encode ()

<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);
?>

Plus tard, utilisez simplement json_decode () pour décoder la chaîne de votre base de données. Tout le reste est inutile, JSON garde intacte la relation de tableau pour une utilisation ultérieure!

Jakub
la source
40
" Tout le reste est inutile " ... sauf peut-être normaliser les données.
Dan Lugg
5
Rofl @ commente au dessus de moi. Comme vous le dites, les déclarations générales sont presque toujours inutiles.
Aaron Cole
12
Je suis content que vous vous amusiez :)
Jakub
16
"Les généralisations radicales, ainsi que les absolus, sont toujours fausses. Toujours." ;)
Olie
J'aime que celui-ci garde les clés. Ceci est très utile pour une utilisation ultérieure.
Apolymoxic
45
json_encode($data) //converts an array to JSON string
json_decode($jsonString) //converts json string to php array

POURQUOI JSON: Vous pouvez l'utiliser avec la plupart des langages de programmation, la chaîne créée par la fonction serialize () de php est lisible en PHP uniquement, et vous n'aimerez pas stocker de telles choses dans vos bases de données spécialement si la base de données est partagée entre des applications écrites en différents langages de programmation

sumit
la source
1
JFI dans mon utilisation, j'ai dû appeler $ data = json_decode ($ jsonString, true)
Terminality
le deuxième argument est facultatif, dans la plupart des cas, il fonctionne sans cela.
sumit
Cela fonctionne parfaitement pour les tableaux à une ou plusieurs dimensions et, à mon avis, cela devrait être la réponse acceptée. Pensez également à ajouter true comme second paramètre.
Combinez
36

Non, vous ne voulez pas le stocker comme une seule chaîne dans votre base de données comme ça.

Vous pouvez utiliser, serialize()mais cela rendra vos données plus difficiles à rechercher, plus difficiles à utiliser et gaspillera de l'espace.

Vous pouvez également effectuer un autre encodage, mais il est généralement sujet au même problème.

La raison pour laquelle vous avez une base de données est que vous pouvez accomplir un travail comme celui-ci de manière triviale. Vous n'avez pas besoin d'une table pour stocker les tableaux, vous avez besoin d'une table que vous pouvez représenter comme un tableau.

Exemple:

id | word
1  | Sports
2  | Festivals
3  | Classes
4  | Other

Vous devez simplement sélectionner les données de la table avec SQL, plutôt que d'avoir une table qui ressemble à:

id | word
1  | Sports|Festivals|Classes|Other

Ce n'est pas ainsi que quelqu'un conçoit un schéma dans une base de données relationnelle, cela va totalement à l'encontre de son objectif.

Incognito
la source
2
bien sûr, vous n'avez pas à échapper aux délimiteurs!
Chris G.
2
@MarcB Il rend l'encodage à l'épreuve des idiots, standard, sujet à moins de bugs et facilement exportable vers un tableau. Doit-il utiliser une autre table? Probablement. Est-ce mieux que tout le monde dit imploser? Absolument.
Incognito
6
La bonne réponse à cette question serait: n'insérez pas de valeurs sérialisées dans un SGBDR. C'est le genre de chose qui devrait invoquer des rapaces .
NullUserException
1
@timdev: json-escape peut dans certaines situations correspondre à un échappement SQL, mais en fonction de cela, cela vous brûlera à la fin. JSON utilise des barres obliques inverses - que faire si vous êtes sur une base de données qui ne reconnaît pas les barres obliques inverses et utilise des guillemets doubles pour s'échapper? par exemple ''au lieu de \'?
Marc B
1
Bien que je sois d'accord avec le principe exprimé ici (les formes normales sont bonnes, utiliser DB pour structurer est bon, duh), toute réponse qui commence par "Non, vous ne voulez pas ..." déclenche des cloches dans ma tête. Vous n'avez pas le contexte complet de la question du demandeur, et croyez-le ou non, ils pourraient simplement avoir une excellente raison de dénormaliser ces données particulières et de les stocker dans un seul champ. Non, vous n'êtes pas omniscient; vous ne savez PAS ce que le demandeur veut. Mettez vos opinions dans un commentaire , pas une réponse , s'il vous plaît.
système PAUSE
35

L'un des meilleurs moyens:

echo print_r($array, true);
vvkatwss vvkatwss
la source
10
veuillez développer votre réponse, en montrant comment cela résout le problème
Our Man in Bananas
1
Vous pouvez également utiliser: "print_r ($ array, false);", car cela imprimera le tableau sans renvoyer de valeur. Si true est donné, print_r () ne s'imprimera pas de lui-même et renverra simplement la chaîne. Plus sur: php.net/manual/en/function.print-r.php
Garrett
Celui-ci devrait être le meilleur car il json_decodegâche le format, ce qui cause de la confusion.
Aminah Nuraini
14

implode () :

<?php
$string = implode('|',$types);

Cependant, Incognito a raison, vous ne voulez probablement pas le stocker de cette façon - c'est un gaspillage total de la puissance relationnelle de votre base de données.

Si vous êtes déterminé à sérialiser la sérialisation, vous pouvez également envisager d'utiliser json_encode ()

timdev
la source
implode est limité aux tableaux plats
ahnbizcad
11

Celui-ci enregistre CLÉS ET VALEURS

function array2string($data){
    $log_a = "";
    foreach ($data as $key => $value) {
        if(is_array($value))    $log_a .= "[".$key."] => (". array2string($value). ") \n";
        else                    $log_a .= "[".$key."] => ".$value."\n";
    }
    return $log_a;
}

J'espère que cela aide quelqu'un.

Ante Braovic
la source
6
$data = array("asdcasdc","35353","asdca353sdc","sadcasdc","sadcasdc","asdcsdcsad");

$string_array = json_encode($data);

vous pouvez maintenant insérer cette valeur $ string_array dans la base de données

Akbar Mirsiddikov
la source
5

Pour les tableaux associatifs de magasin, vous pouvez utiliser serialize:

$arr = array(
    'a' => 1,
    'b' => 2,
    'c' => 3
);

file_put_contents('stored-array.txt', serialize($arr));

Et chargez en utilisant unserialize:

$arr = unserialize(file_get_contents('stored-array.txt'));

print_r($arr);

Mais si .phpvous avez besoin de créer des fichiers dinamic avec un tableau (par exemple des fichiers de configuration), vous pouvez utiliser var_export(..., true);, comme ceci:

Enregistrer dans le fichier:

$arr = array(
    'a' => 1,
    'b' => 2,
    'c' => 3
);

$str = preg_replace('#,(\s+|)\)#', '$1)', var_export($arr, true));
$str = '<?php' . PHP_EOL . 'return ' . $str . ';';

file_put_contents('config.php', $str);

Obtenez les valeurs du tableau:

$arr = include 'config.php';

print_r($arr);
Guilherme Nascimento
la source
3

Vous pouvez utiliser la fonction de chaîne PHP implode()

Comme,

<?php
  $sports=$_POST['sports'];;
  $festival=$_POST['festival'];
  $food=$_POST['food'];
  $array=[$sports,$festival,$food];
  $string=implode('|',$array);
  echo $string;
?>

Si, par exemple, $sports='football'; $festival='janmastami'; $food='biriyani';

La sortie serait alors:

football|janmastami|biriyani

Pour plus de détails sur la fonction implode () de PHP, reportez-vous à w3schools


la source
1

il y a plusieurs façons,

les deux meilleurs moyens pour cela sont

$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
//ouputs as
{"a":1,"b":2,"c":3,"d":4,"e":5}


$b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r($b, true); // $results now contains output from print_r
Daud Malik
la source
Vous répétez des réponses qui ont déjà été données. Cela n'ajoute pas de nouvelle valeur ni de nouvelles méthodes.
Tschallacka
@Tschallacka ouais mais très peu de réponses sur ce post fournissent une sortie ....
Daud Malik