Matrice a stringa PHP?


283

Qual è il metodo migliore per convertire un array PHP in una stringa?
Ho la variabile $typeche è una matrice di tipi.

$type = $_POST[type];

Voglio memorizzarlo come una singola stringa nel mio database con ogni voce separata da |:

Sport | Festivals | Altro


24
Evitare di inserire valori serializzati in un database. Ecco perché: stackoverflow.com/questions/7364803/...
— NullUserException

14
@NullUserException ఠ_ఠ Sono d'accordo sul fatto che l'inserimento di valori serializzati nel DB bruci assolutamente gli occhi, ma non conosci la sua situazione - forse è giustificata.
— AngryHacker,

4
Penso che questa domanda dovrebbe essere riaperta. È una domanda utile per i principianti e non penso che sia fuori tema.
— SaidbakR,

1
cosa succede se alcuni dei valori nella matrice hanno caratteri |
— Accusa

Puoi quindi sfuggire a quei personaggi. Leggilo qui. php.net/manual/en/regexp.reference.escape.php
— FortuneSoldier

Risposte:


352

Usa implode

implode("|",$type);

13
Ciò è utile a meno che non si disponga di array nidificati, il che può accadere $_POSTse si utilizzano input di moduli con nome array.
— Leith,

con array nidificati basta usare un foreach che funzionerà.
— deepcell,

224

Puoi usare json_encode ()

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

echo json_encode($arr);
?>

Successivamente basta usare json_decode () per decodificare la stringa dal proprio DB. Qualsiasi altra cosa è inutile, JSON mantiene intatta la relazione dell'array per un uso successivo!


40
" Qualsiasi altra cosa è inutile " ... tranne forse per normalizzare i dati.
— Dan Lugg,

5
Rofl @ commenta sopra di me. Come dici tu, le affermazioni generali sono quasi sempre inutili.
— Aaron Cole,

12
Sono contento che vi siate divertiti :)
— Jakub,

16
"Le generalizzazioni generali, così come gli assoluti, sono sempre sbagliate. Sempre." ;)
— Olie,

Mi piace che questo mantenga le chiavi. Questo è molto utile per un uso successivo.
— Apolymoxic

45
json_encode($data) //converts an array to JSON string
json_decode($jsonString) //converts json string to php array

PERCHÉ JSON: Puoi usarlo con la maggior parte dei linguaggi di programmazione, la stringa creata dalla funzione serialize () di php è leggibile solo in PHP e non ti piacerebbe archiviare tali cose nei tuoi database specialmente se il database è condiviso tra le applicazioni scritte in diversi linguaggi di programmazione


1
JFI nel mio uso ho dovuto chiamare $ data = json_decode ($ jsonString, true)
— Terminalità

il secondo argomento è facoltativo, nella maggior parte dei casi funziona senza quello.
— sumit

Questo funziona in modo ottimale per array monodimensionali o multidimensionali e secondo me dovrebbe essere la risposta accettata. Considera anche di aggiungere true come secondo parametro.
— Combina il

36

No, non vuoi memorizzarlo come una singola stringa nel tuo database in quel modo.

Potresti usarlo serialize()ma questo renderà i tuoi dati più difficili da cercare, più difficili da lavorare e sprecherà spazio.

Potresti fare anche qualche altra codifica, ma è generalmente soggetta allo stesso problema.

L'intero motivo per cui hai un DB è che puoi svolgere un lavoro del genere in modo banale. Non è necessaria una tabella per archiviare le matrici, è necessaria una tabella che è possibile rappresentare come matrice.

Esempio:

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

Dovresti semplicemente selezionare i dati dalla tabella con SQL, piuttosto che avere una tabella che assomigli a:

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

Non è così che chiunque progetta uno schema in un database relazionale, ne sconfigge totalmente lo scopo.


2
certo che lo è, non devi sfuggire ai delimitatori!
— Chris G.

2
@MarcB Rende la codifica a prova di idiota, standard, soggetta a meno bug e facilmente esportabile in un array. Dovrebbe usare un altro tavolo? Probabilmente. È meglio di tutti quelli che dicono implodono? Assolutamente.
— Incognito,

6
La risposta giusta a questa domanda sarebbe: non inserire valori serializzati in un RDBMS. Questo è il tipo di cosa che dovrebbe evocare i rapaci .
— NullUserException,

1
@timdev: json-escaping può in alcune situazioni corrispondere all'escaping SQL, ma a seconda di ciò alla fine ti brucerà. JSON utilizza le barre rovesciate: cosa succede se si utilizza un DB che non riconosce le barre rovesciate e utilizza virgolette doppie per la fuga? ad es. ''invece di \'?
— Marc B,

1
Mentre sono d'accordo con il principio qui espresso (le forme normali sono buone, usare DB per strutturare è buono, duh), qualsiasi risposta che inizia con "No, non vuoi ..." mi fa suonare la campana nella testa. Non hai il contesto completo della domanda del richiedente, e che ci crediate o no, potrebbero avere un motivo eccellente per denormalizzare questi dati particolari e archiviarli in un singolo campo. No, non sei onnisciente; NON sai cosa vuole il richiedente. Inserisci le tue opinioni in un commento , non in una risposta , per favore.
— sistema PAUSA

35

Uno dei modi migliori:

echo print_r($array, true);

10
per favore, elabora la tua risposta, mostrando come risolve il problema
— Our Man in Bananas,

1
Puoi anche usare: "print_r ($ array, false);", poiché questo stamperà l'array senza restituire un valore. Se viene fornito true, print_r () non stampa da solo e restituisce semplicemente la stringa. Altro su: php.net/manual/en/function.print-r.php
— Garrett

Questo dovrebbe essere il migliore in quanto json_decodeconfonde il formato causando confusione.
— Aminah Nuraini,

14

implode () :

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

Tuttavia, Incognito ha ragione, probabilmente non vorrai memorizzarlo in questo modo - è uno spreco totale della potenza relazionale del tuo database.

Se non hai impostato la serializzazione, potresti anche prendere in considerazione l'utilizzo di json_encode ()


implode è limitato ad array piatti
— ahnbizcad il

11

Questo risparmia CHIAVI E VALORI

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;
}

Spero che aiuti qualcuno.


6
$data = array("asdcasdc","35353","asdca353sdc","sadcasdc","sadcasdc","asdcsdcsad");

$string_array = json_encode($data);

ora è possibile inserire questo valore $ string_array nel database


5

Per gli array associativi del negozio è possibile utilizzare serialize:

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

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

E carica usando unserialize:

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

print_r($arr);

Ma se è necessario creare .phpfile dinamici con array (ad esempio file di configurazione), è possibile utilizzare var_export(..., true);, in questo modo:

Salva nel file:

$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);

Ottieni valori array:

$arr = include 'config.php';

print_r($arr);

3

È possibile utilizzare la funzione stringa PHP implode()

Piace,

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

Se, ad esempio, $sports='football'; $festival='janmastami'; $food='biriyani';

Quindi l'output sarebbe:

football|janmastami|biriyani

Per maggiori dettagli sulla funzione implode () di PHP consultare w3schools


0

ci sono molti modi ,

due modi migliori per questo sono

$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

Stai ripetendo le risposte che sono già state fornite. Questo non aggiunge nuovo valore o nuovi metodi.
— Tschallacka,

@Tschallacka sì, ma pochissime risposte su questo post forniscono risultati ....
— Daud Malik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.