Dizi PHP dizesi?


282

PHP dizisini dizgeye dönüştürmenin en iyi yolu nedir? Bir dizi türü olan
değişken var $type.

$type = $_POST[type];

Her girdi ile ayrılmış benim veritabanında tek bir dize olarak saklamak istiyorum |:

Spor | Festivaller | Diğer


24
Lütfen bir veritabanına serileştirilmiş değerler eklemekten kaçının.
Nedeni

14
@NullUserException ఠ_ఠ DB'ye serileştirilmiş değerler eklemenin kesinlikle gözleri yaktığını kabul ediyorum, ancak durumunu bilmiyorsunuz - belki de çok iyi garanti.
AngryHacker

4
Bu sorunun yeniden açılması gerektiğini düşünüyorum. Yeni başlayanlar için yararlı bir soru ve konu dışı olduğunu düşünmüyorum.
SaidbakR

1
dizideki bazı değerlerin karakterleri varsa ne olur |
sumit

Daha sonra bu karakterlerden kaçabilirsiniz. Buradan okuyun. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Yanıtlar:


352

Sadece implode kullanın

implode("|",$type);

13
İç içe diziler $_POSTyoksa, dizi adı verilen form girişlerini kullanıyorsanız bu durum iyi olur .
Leith

iç içe dizilerle sadece çalışacak bir önkol kullanın.
deepcell

224

Json_encode () kullanabilirsiniz

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

echo json_encode($arr);
?>

Daha sonra dize DB'nizden kodu çözmek için json_decode () kullanın. Başka bir şey işe yaramaz, JSON dizi ilişkisini daha sonra kullanmak için sağlam tutar!


40
" Başka bir şey işe yaramaz " ... belki de verileri normalleştirmek dışında.
Dan Lugg

5
Rofl @ üstümdeki yorum. Dediğiniz gibi, battaniye ifadeleri neredeyse her zaman yararsızdır.
Aaron Cole

12
Sizleri ağırladığınıza sevindim :)
Jakub

16
"Süpürme genellemeleri ve mutlaklar her zaman yanlıştır. Her zaman." ;)
Olie

Bunun anahtarları tutmasını seviyorum. Bu daha sonra kullanmak için çok yararlıdır.
Apolymoxic

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

NEDEN JSON: Programlama dillerinin çoğuyla kullanabilirsiniz, php serialize () işlevi tarafından oluşturulan dize yalnızca PHP'de okunabilir ve veritabanı yazılan uygulamalar arasında paylaşılıyorsa bu tür şeyleri veritabanlarınızda özel olarak saklamak istemezsiniz. farklı programlama dilleri


1
JFI benim kullanımda $ data = json_decode ($ jsonString, true) çağırmak zorunda
Terminal

ikinci argüman isteğe bağlıdır, çoğu durumda bu olmadan çalışır.
sumit

Bu tek veya çok boyutlu diziler için mükemmel çalışır ve bence bu kabul edilen cevap olmalıdır. Ayrıca, ikinci parametre olarak true eklemeyi de düşünün.
birleştirin

36

Hayır, veritabanınızda bu şekilde tek bir dize olarak saklamak istemezsiniz.

Kullanabilirsiniz, serialize()ancak bu verilerinizi aramayı zorlaştırır, çalışması zorlaşır ve alan israfı sağlar.

Başka kodlama da yapabilirsiniz, ancak genellikle aynı soruna eğilimlidir.

Bir DB sahip olmanızın tek nedeni, bu tür işleri önemsiz bir şekilde başarabilmenizdir. Dizileri saklamak için bir tabloya, dizi olarak temsil edebileceğiniz bir tabloya ihtiyacınız vardır.

Misal:

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

Aşağıdaki gibi görünen bir tablo yerine verileri SQL ile tablodan seçmeniz yeterlidir:

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

Herhangi biri ilişkisel bir veritabanında bir şemayı bu şekilde tasarlamaz, amacını tamamen yener.


2
elbette, sınırlayıcılardan kaçmak zorunda değilsiniz!
Chris G.20

2
@MarcB Kodlamayı aptallara karşı korumalı, standart, daha az hataya yatkın hale getirir ve bir diziye kolayca dışa aktarılabilir. Başka bir masa kullanmalı mı? Muhtemelen. Bu herkesin çığlık atmasından daha mı iyi? Kesinlikle.
Gizli

6
Bu sorunun doğru yanıtı şudur: RDBMS'ye serileştirilmiş değerler eklemeyin. Bu, raptorları çağırması gereken bir şey .
NullUserException

1
@timdev: json-kaçma bazı durumlarda SQL kaçmaya karşılık gelebilir, ancak buna bağlı olarak sonunda sizi yakarsınız. JSON ters eğik çizgi kullanır - ya ters eğik çizgileri tanımayan ve kaçış için çift tırnak kullanılan bir DB kullanıyorsanız? örneğin ''yerine \'?
Marc B

1
Burada ifade edilen ilkeye katılıyorum (normal formlar iyi, DB'yi yapıya kullanmak iyi, duh), "Hayır, istemiyorsun" ile başlayan herhangi bir cevap kafamdaki çanları ortaya çıkarır. Sorucunun sorusunun tam bağlamına sahip değilseniz ve ister inanın ister inanmayın, bu belirli verileri denormalize etmek ve tek bir alanda saklamak için mükemmel bir nedenleri olabilir . Hayır, her şeyi bilen değilsin; askerin ne istediğini bilmiyorsun. Düşüncelerinizi bir cevap değil , bir yorum yazın , lütfen.
sistem DURAKLAT

35

En iyi yollardan biri:

echo print_r($array, true);

10
lütfen sorunun nasıl çözüldüğünü gösteren cevabınızı detaylandırın
Adamımız

1
Ayrıca şunları kullanabilirsiniz: "print_r ($ array, false);", bu dizi döndürmeden diziyi yazdıracaktır. True belirtilirse, print_r () kendi başına yazdırılmaz ve dizeyi döndürür. Daha fazla bilgi için: php.net/manual/en/function.print-r.php
Garrett

json_decodeKarışıklığa neden olan formatla uğraştığından bu en iyisi olmalı .
Aminah Nuraini

14

implode () :

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

Ancak, Gizli haklıdır, muhtemelen bu şekilde depolamak istemezsiniz - bu, veritabanınızın ilişkisel gücünün toplam kaybıdır.

Serileştirme konusunda kararsızsanız json_encode () kullanmayı da düşünebilirsiniz.


implode düz dizilerle sınırlıdır
ahnbizcad

11

Bu KEYS & VALUES'i kurtarıyor

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

Umarım birine yardımcı olur.


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

$string_array = json_encode($data);

şimdi bu $ string_array değerini Veritabanına ekleyebilirsiniz


5

Mağaza ilişkilendirilebilir dizileri için şunları kullanabilirsiniz serialize:

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

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

Ve kullanarak yükleyin unserialize:

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

print_r($arr);

Ancak .phpdizi içeren dinamik dosyalar oluşturmaya ihtiyacınız varsa (örneğin yapılandırma dosyaları), şöyle kullanabilirsiniz var_export(..., true);:

Dosyaya kaydet:

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

Dizi değerlerini alın:

$arr = include 'config.php';

print_r($arr);

3

PHP string fonksiyonunu kullanabilirsiniz implode()

Sevmek,

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

Örneğin, $sports='football'; $festival='janmastami'; $food='biriyani';

Sonra çıktı:

football|janmastami|biriyani

PHP implode () işlevi hakkında daha fazla bilgi için bkz. W3schools


0

birçok yolu var ,

bunun için en iyi iki yol

$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

Zaten verilen cevapları tekrarlıyorsunuz. Bu, yeni değer veya yeni yöntemler eklemez.
Tschallacka

@Tschallacka evet ama bu yazı üzerine çok az cevap çıktı sağlar ....
Daud Malik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.