Tablica na ciąg PHP?

282

Jaka jest najlepsza metoda konwersji tablicy PHP na ciąg?
Mam zmienną, $typektóra jest tablicą typów.

$type = $_POST[type];

Chcę przechowywać go jako pojedynczy ciąg w mojej bazie danych z każdym wpisem oddzielonym |:

Sport | Festiwale | Inne

Philip Kirkbride
źródło
24
Powstrzymaj się od wstawiania serializowanych wartości do bazy danych. Oto dlaczego: stackoverflow.com/questions/7364803/…
NullUserException
14
@NullUserException ఠ_ఠ Zgadzam się, że wstawienie serializowanych wartości do DB po prostu absolutnie pali oczy, ale nie znasz jego sytuacji - może to bardzo dobrze uzasadnione.
AngryHacker
4
Myślę, że to pytanie powinno zostać ponownie otwarte. Jest to przydatne pytanie dla początkujących i nie sądzę, że jest nie na temat.
SaidbakR
1
co jeśli niektóre wartości w tablicy mają znaki |
sumit
Następnie możesz uciec od tych postaci. Przeczytaj tutaj. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Odpowiedzi:

352

Po prostu użyj implode

implode("|",$type);
Niet the Dark Absol
źródło
13
Jest to dobre, chyba że masz zagnieżdżone tablice - co może się zdarzyć, $_POSTjeśli używasz formularzy o nazwie tablicowej.
Leith
z zagnieżdżonymi tablicami wystarczy użyć foreach, który zadziała.
deepcell
224

Możesz użyć json_encode ()

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

echo json_encode($arr);
?>

Później wystarczy użyć json_decode (), aby zdekodować ciąg z bazy danych. Wszystko inne jest bezużyteczne, JSON utrzymuje nienaruszoną relację tablicową do późniejszego użycia!

Kuba
źródło
40
Wszystko inne jest bezużyteczne ” ... oprócz być może normalizacji danych.
Dan Lugg,
5
Komentarz Rofl @ nade mną. Jak mówisz, ogólne instrukcje są prawie zawsze nieprzydatne.
Aaron Cole,
12
Cieszę się, że się bawicie :)
Jakub
16
„Szerokie uogólnienia, jak również absoluty, są zawsze błędne. Zawsze”. ;)
Olie,
Podoba mi się, że ten trzyma klucze. Jest to bardzo przydatne do późniejszego użycia.
Apolymoxic
45
json_encode($data) //converts an array to JSON string
json_decode($jsonString) //converts json string to php array

DLACZEGO JSON: Możesz go używać z większością języków programowania, łańcuch utworzony przez funkcję serialize () php jest czytelny tylko w PHP i nie będziesz chciał przechowywać takich rzeczy w swoich bazach danych, szczególnie jeśli baza danych jest współużytkowana przez aplikacje napisane w różne języki programowania

sumit
źródło
1
JFI w moim użytku musiałem zadzwonić $ data = json_decode ($ jsonString, true)
Terminality
drugi argument jest opcjonalny, w większości przypadków działa bez niego.
sumit
Działa to doskonale w przypadku tablic jedno- lub wielowymiarowych i moim zdaniem powinna to być zaakceptowana odpowiedź. Rozważ także dodanie wartości true jako drugiego parametru.
Połącz
36

Nie, nie chcesz przechowywać tego jako jednego ciągu w swojej bazie danych.

Możesz użyć, serialize()ale spowoduje to, że Twoje dane będą trudniejsze do wyszukiwania, trudniejsze do pracy i marnuje miejsce.

Możesz także wykonać inne kodowanie, ale ogólnie jest ono podatne na ten sam problem.

Głównym powodem posiadania DB jest to, że możesz wykonywać takie prace w trywialny sposób. Nie potrzebujesz tabeli do przechowywania tablic, potrzebujesz tabeli, którą możesz reprezentować jako tablicę.

Przykład:

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

Po prostu wybrałbyś dane z tabeli za pomocą SQL, zamiast tabeli, która wygląda następująco:

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

To nie jest sposób, w jaki ktokolwiek projektuje schemat w relacyjnej bazie danych, ale całkowicie nie spełnia jego celu.

Incognito
źródło
2
na pewno tak, nie musisz uciec ogranicznikom!
Chris G.
2
@MarcB To sprawia, że ​​kodowanie jest idiotyczne, standardowe, podatne na mniej błędów i łatwe do eksportu z powrotem do tablicy. Czy powinien użyć innego stołu? Prawdopodobnie. Czy to jest lepsze niż wszyscy mówią implode? Absolutnie.
Incognito,
6
Prawidłowa odpowiedź na to pytanie brzmi: nie wstawiaj wartości zserializowanych do RDBMS. To jest rodzaj rzeczy, która powinna przywołać ptaków drapieżnych .
NullUserException
1
@timdev: json-escaping może w niektórych sytuacjach odpowiadać ucieczce SQL, ale w zależności od tego po prostu cię w końcu spali. JSON używa odwrotnych ukośników - co zrobić, jeśli korzystasz z DB, który nie rozpoznaje odwrotnych ukośników i używa podwójnych cudzysłowów do ucieczki? np. ''zamiast \'?
Marc B
1
Chociaż zgadzam się z zasadą wyrażoną tutaj (normalne formy są dobre, używanie DB do struktury jest dobre, duh), każda odpowiedź, która zaczyna się od „Nie, nie chcesz ...” wywołuje dzwonki w mojej głowie. Nie masz pełnego kontekstu pytania pytającego i możesz w to uwierzyć lub nie, mogą mieć doskonały powód do denormalizacji tych konkretnych danych i przechowywania ich w jednym polu. Nie, nie jesteś wszechwiedzący; NIE wiesz, czego chce pytający. Umieść swoje opinie w komentarzu , a nie w odpowiedzi , proszę.
system PAUZA
35

Jeden z najlepszych sposobów:

echo print_r($array, true);
vvkatwss vvkatwss
źródło
10
wyjaśnij swoją odpowiedź, pokazując, jak to rozwiązuje problem
Our Man in Bananas
1
Możesz także użyć: „print_r ($ array, false);”, ponieważ spowoduje to wydrukowanie tablicy bez zwracania wartości. Jeśli podano true, print_r () nie wydrukuje samodzielnie i po prostu zwróci ciąg. Więcej na: php.net/manual/en/function.print-r.php
Garrett
Ten powinien być najlepszy, ponieważ json_decodemiesza się z formatem powodującym zamieszanie.
Aminah Nuraini
14

implode () :

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

Jednak Incognito ma rację, prawdopodobnie nie chcesz go przechowywać w ten sposób - to całkowite marnowanie mocy relacyjnej bazy danych.

Jeśli nie możesz się zdecydować na serializację, możesz także rozważyć użycie json_encode ()

timdev
źródło
implode jest ograniczony do płaskich tablic
ahnbizcad
11

Ten zapisuje KLUCZE I WARTOŚCI

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

Mam nadzieję, że to komuś pomoże.

Ante Braovic
źródło
6
$data = array("asdcasdc","35353","asdca353sdc","sadcasdc","sadcasdc","asdcsdcsad");

$string_array = json_encode($data);

teraz możesz wstawić tę wartość $ string_array do bazy danych

Akbar Mirsiddikov
źródło
5

Do tablic asocjacyjnych sklepu możesz użyć serialize:

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

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

I załaduj za pomocą unserialize:

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

print_r($arr);

Ale jeśli potrzebujesz stworzyć .phppliki dynamiczne z tablicą (na przykład pliki konfiguracyjne), możesz użyć var_export(..., true);:

Zapisz w pliku:

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

Uzyskaj wartości tablic:

$arr = include 'config.php';

print_r($arr);
Guilherme Nascimento
źródło
3

Możesz użyć funkcji łańcuchowej PHP implode()

Lubić,

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

Jeśli na przykład $sports='football'; $festival='janmastami'; $food='biriyani';

Następnie dane wyjściowe będą:

football|janmastami|biriyani

Aby uzyskać więcej informacji na temat funkcji PHP implode (), zobacz w3schools


źródło
0

jest wiele sposobów ,

są na to dwa najlepsze sposoby

$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
źródło
Powtarzasz odpowiedzi, które już zostały udzielone. Nie dodaje to nowej wartości ani nowych metod.
Tschallacka
@Tschallacka tak, ale bardzo niewiele odpowiedzi w tym poście zapewnia wynik ....
Daud Malik