Matriz para encadenar PHP?


282

¿Cuál es el mejor método para convertir una matriz PHP en una cadena?
Tengo la variable $typeque es una matriz de tipos.

$type = $_POST[type];

Quiero almacenarlo como una sola cadena en mi base de datos con cada entrada separada por | :

Deportes | Festivales | Otros


24
Abstenerse de insertar valores serializados en una base de datos. He aquí por qué: stackoverflow.com/questions/7364803/…
NullUserException

14
@NullUserException ఠ_ఠ Estoy de acuerdo en que insertar valores serializados en la base de datos simplemente quema los ojos, pero usted no sabe su situación, muy bien tal vez esté justificado.
AngryHacker

44
Creo que esta pregunta debería reabrirse. Es una pregunta útil para principiantes y no creo que esté fuera de tema.
SaidbakR

1
¿Qué pasa si algunos de los valores en la matriz tienen caracteres |
sumitido

Entonces puedes escapar de esos personajes. Léelo aquí. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Respuestas:


352

Simplemente use implosión

implode("|",$type);

13
Esto es bueno a menos que tenga matrices anidadas, lo que puede suceder $_POSTsi está utilizando entradas de formulario con nombre de matriz.
Leith

con matrices anidadas solo use un foreach, funcionará.
deepcell

224

Puedes usar json_encode ()

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

echo json_encode($arr);
?>

Más tarde, simplemente use json_decode () para decodificar la cadena de su base de datos. ¡Cualquier otra cosa es inútil, JSON mantiene la relación de matriz intacta para su uso posterior!


40
" Cualquier otra cosa es inútil " ... excepto quizás normalizar los datos.
Dan Lugg

55
Rofl @ comenta encima de mí. Como usted dice, las declaraciones generales son casi siempre inútiles.
Aaron Cole

12
Me alegro de que estén entretenidos :)
Jakub

16
"Las generalizaciones radicales, así como los absolutos, siempre están mal. Siempre". ;)
Olie

Me gusta que este guarde las llaves. Esto es muy útil para su uso posterior.
Apolymoxic

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

POR QUÉ JSON: Puede usarlo con la mayoría de los lenguajes de programación, la cadena creada por la función serialize () de php es legible solo en PHP, y no le gustaría almacenar tales cosas en sus bases de datos, especialmente si la base de datos se comparte entre aplicaciones escritas en diferentes lenguajes de programación


1
JFI en mi uso que tuvo que llamar a los datos $ = $ (json_decode jsonString, true)
terminalidad

El segundo argumento es opcional, en la mayoría de los casos funciona sin eso.
sumitir el

Esto funciona para matrices de una o varias dimensiones excelentes y, en mi opinión, esta debería ser la respuesta aceptada. Considere también agregar verdadero como segundo parámetro.
Combinar

36

No, no desea almacenarlo como una sola cadena en su base de datos así.

Podría usarlo, serialize()pero esto hará que sus datos sean más difíciles de buscar, más difíciles de trabajar y desperdicie espacio.

También podría hacer otra codificación, pero generalmente es propenso al mismo problema.

Toda la razón por la que tiene una base de datos es para que pueda realizar un trabajo como este de manera trivial. No necesita una tabla para almacenar matrices, necesita una tabla que pueda representar como una matriz.

Ejemplo:

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

Simplemente seleccionaría los datos de la tabla con SQL, en lugar de tener una tabla que se vea así:

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

No es así como alguien diseña un esquema en una base de datos relacional, derrota totalmente el propósito del mismo.


2
¡claro que sí, no tienes que escapar de los delimitadores!
Chris G.

2
@MarcB Hace que la codificación sea a prueba de idiotas, estándar, propensa a menos errores y fácilmente exportable a una matriz. ¿Debería usar otra mesa? Probablemente. ¿Es esto mejor de lo que todos dicen implosión? Absolutamente.
Incógnito

66
La respuesta correcta a esta pregunta sería: no inserte valores serializados en un RDBMS. Este es el tipo de cosa que debería convocar a las aves rapaces .
NullUserException

1
@timdev: json-escape puede en algunas situaciones corresponder al escape de SQL, pero dependiendo de eso simplemente te quemará al final. JSON usa barras invertidas: ¿qué sucede si está en una base de datos que no reconoce las barras invertidas y utiliza comillas dobles para escapar? por ejemplo, en ''lugar de \'?
Marc B

1
Si bien estoy de acuerdo con el principio expresado aquí (las formas normales son buenas, usar DB para estructurar es bueno, duh), cualquier respuesta que comience con "No, no quieres ..." hace sonar las campanas en mi cabeza. No tiene el contexto completo de la pregunta del autor de la pregunta, y lo creas o no, es posible que tengan una excelente razón para desnormalizar estos datos en particular y almacenarlos en un solo campo. No, no eres omnisciente; NO sabes lo que quiere el que pregunta. Pon tus opiniones en un comentario , no en una respuesta , por favor.
PAUSA del sistema

35

Una de las mejores maneras:

echo print_r($array, true);

10
explique su respuesta, mostrando cómo resuelve el problema
Our Man in Bananas

1
También puede usar: "print_r ($ array, false);", ya que esto imprimirá la matriz sin devolver un valor. Si se da verdadero, print_r () no imprimirá solo y simplemente devolverá la cadena. Más en: php.net/manual/en/function.print-r.php
Garrett

Este debería ser el mejor, ya que se json_decodeequivoca con el formato causando confusión.
Aminah Nuraini

14

implosionar () :

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

Sin embargo, Incognito tiene razón, probablemente no quiera almacenarlo de esa manera: es un desperdicio total del poder relacional de su base de datos.

Si está empeñado en la serialización, también podría considerar usar json_encode ()


implode se limita a matrices planas
ahnbizcad

11

Este ahorra CLAVES Y VALORES

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

Espero que ayude a alguien.


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

$string_array = json_encode($data);

ahora puede insertar este valor de $ string_array en la base de datos


5

Para las matrices asociativas de tienda puede usar serialize:

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

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

Y carga usando unserialize:

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

print_r($arr);

Pero si necesita crear .phparchivos dinámicos con matriz (por ejemplo, archivos de configuración), puede usar var_export(..., true);, así:

Guardar en archivo:

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

Obtener valores de matriz:

$arr = include 'config.php';

print_r($arr);

3

Puedes usar la función de cadena PHP implode()

Me gusta,

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

Si, por ejemplo, $sports='football'; $festival='janmastami'; $food='biriyani';

Entonces la salida sería:

football|janmastami|biriyani

Para más detalles sobre la función implode () de PHP, consulte w3schools


0

hay muchas maneras ,

dos mejores formas para esto son

$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

Estás repitiendo respuestas que ya se dieron. Esto no agrega nuevo valor o nuevos métodos.
Tschallacka

@Tschallacka sí, pero muy pocas respuestas en esta publicación proporcionan resultados ...
Daud Malik
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.