Matriz para String PHP?


282

Qual é o melhor método para converter uma matriz PHP em uma string?
Eu tenho a variável $typeque é uma matriz de tipos.

$type = $_POST[type];

Quero armazená-lo como uma única sequência no meu banco de dados, com cada entrada separada por |:

Esportes | Festivais | Outros


24
Evite inserir valores serializados em um banco de dados. Aqui está o porquê: stackoverflow.com/questions/7364803/…
NullUserException

14
@NullUserException ఠ_ఠ Eu concordo que a inserção de valores serializados no banco de dados simplesmente queima os olhos, mas você não conhece a situação dele - muito bem, talvez justificada.
AngryHacker

4
Penso que esta questão deve ser reaberta. É uma pergunta útil para iniciantes e não acho que seja fora de tópico.
SaidbakR

1
e se alguns dos valores na matriz tiverem caracteres |
sumit

Você pode escapar desses caracteres. Leia aqui. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier 26/02

Respostas:


352

Basta usar implode

implode("|",$type);

13
Isso é bom, a menos que você tenha matrizes aninhadas - o que pode acontecer $_POSTse você estiver usando entradas de formulário nomeadas por matriz.
Leith

com matrizes aninhadas, basta usar um foreach que funcione.
039

224

Você pode usar json_encode ()

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

echo json_encode($arr);
?>

Mais tarde, use json_decode () para decodificar a string do seu banco de dados. Qualquer outra coisa é inútil, o JSON mantém intacto o relacionamento do array para uso posterior!


40
" Qualquer outra coisa é inútil " ... exceto, talvez, normalizando os dados.
Dan Lugg

5
Rofl @ comentário acima de mim. Como você diz, declarações gerais quase sempre são inúteis.
Aaron Cole

12
Fico feliz que vocês estão entretidos :)
Jakub

16
"Generalizações abrangentes, assim como absolutas, estão sempre erradas. Sempre." ;)
Olie

Eu gosto que este fique com as chaves. Isso é muito útil para uso posterior.
Apolymoxic 16/07/19

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

POR QUE JSON: Você pode usá-lo com a maioria das linguagens de programação, a string criada pela função serialize () do php é legível apenas no PHP e você não gostaria de armazenar essas coisas em seus bancos de dados, especialmente se o banco de dados for compartilhado entre aplicativos escritos em diferentes linguagens de programação


1
JFI no meu uso eu tive que chamar $ data = json_decode ($ jsonString, true)
Terminality

o segundo argumento é opcional, na maioria dos casos funciona sem isso.
sumit

Isso funciona para matrizes unidimensionais ou multidimensionais excelentes e, na minha opinião, essa deve ser a resposta aceita. Considere também adicionar true como um segundo parâmetro.
Combine

36

Não, você não deseja armazená-lo como uma única sequência no seu banco de dados.

Você pode usar, serialize()mas isso tornará seus dados mais difíceis de pesquisar, mais difíceis de trabalhar e desperdiçará espaço.

Você também pode fazer outra codificação, mas geralmente é propenso ao mesmo problema.

Todo o motivo de você ter um banco de dados é poder realizar um trabalho como esse trivialmente. Você não precisa de uma tabela para armazenar matrizes, precisa de uma tabela que possa representar como uma matriz.

Exemplo:

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

Você simplesmente selecionaria os dados da tabela com SQL, em vez de ter uma tabela parecida com:

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

Não é assim que alguém projeta um esquema em um banco de dados relacional, mas derrota totalmente seu objetivo.


2
Com certeza, você não precisa escapar dos delimitadores!
Chris G.

2
@MarcB Torna a codificação à prova de idiotas, padrão, propensa a menos erros e facilmente exportável de volta para uma matriz. Ele deveria usar outra mesa? Provavelmente. Isso é melhor do que todo mundo dizendo implodir? Absolutamente.
Incognito

6
A resposta certa para essa pergunta seria: não insira valores serializados em um RDBMS. Esse é o tipo de coisa que deve convocar raptores .
NullUserException 20/09

1
@timdev: o json-escaping pode, em algumas situações, corresponder ao escape do SQL, mas dependendo disso, você será queimado no final. O JSON usa barras invertidas - e se você estiver em um banco de dados que não reconheça barras invertidas e use aspas duplas para escapar? por exemplo, em ''vez de \'?
Marc B

1
Embora eu concorde com o princípio expresso aqui (as formas normais são boas, usar o DB para estruturar é bom, duh), qualquer resposta que comece com "Não, você não quer ..." dispara sinos na minha cabeça. Você não tem o contexto completo da pergunta do solicitante e, acredite ou não, eles podem ter apenas um excelente motivo para desnormalizar esses dados específicos e armazená-los em um único campo. Não, você não é onisciente; você NÃO sabe o que o solicitante deseja. Coloque suas opiniões em um comentário , não em uma resposta , por favor.
system PAUSE

35

Uma das melhores maneiras:

echo print_r($array, true);

10
por favor, elabore sua resposta, mostrando como ele resolve o problema #
Our Man in Bananas

1
Você também pode usar: "print_r ($ array, false);", pois isso imprimirá o array sem retornar um valor. Se true for fornecido, print_r () não será impresso por si só e simplesmente retornará a string. Mais em: php.net/manual/pt/function.print-r.php
Garrett

Este deve ser o melhor, já que json_decodemexe com o formato causando confusão.
Aminah Nuraini

14

implode () :

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

No entanto, o Incognito está certo, você provavelmente não deseja armazená-lo dessa maneira - é um desperdício total do poder relacional do seu banco de dados.

Se você estiver com uma série de serializações, considere também o uso de json_encode ()


implode é limitado a matrizes planas
ahnbizcad

11

Este economiza CHAVES E 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 ajude alguém.


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

$string_array = json_encode($data);

agora você pode inserir esse valor $ string_array no banco de dados


5

Para matrizes associativas de loja, você pode usar serialize:

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

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

E carregue usando unserialize:

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

print_r($arr);

Mas se for necessário criar .phparquivos dinâmicos com array (por exemplo, arquivos de configuração), você pode usar var_export(..., true);, assim:

Salvar no arquivo:

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

Obtenha valores de matriz:

$arr = include 'config.php';

print_r($arr);

3

Você pode usar a função de string PHP implode()

Gostar,

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

Se, por exemplo, $sports='football'; $festival='janmastami'; $food='biriyani';

Então a saída seria:

football|janmastami|biriyani

Para mais detalhes sobre a função implode () do PHP, consulte w3schools


0

existem muitos caminhos ,

duas melhores maneiras para isso são

$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

Você está repetindo respostas que já foram dadas. Isso não adiciona novo valor ou novos métodos.
Tschallacka

@Tschallacka sim, mas muito poucas respostas deste post fornecer saída ....
Daud Malik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.