Масив до рядкового PHP?


282

Який найкращий метод перетворення масиву PHP в рядок?
У мене є змінна, $typeяка є масивом типів.

$type = $_POST[type];

Я хочу зберігати його як єдиний рядок у моїй базі даних, при цьому кожен запис розділяється |:

Спорт | Фестивалі | Інше


24
Утримайтеся від вставки серіалізованих значень у базу даних. Ось чому: stackoverflow.com/questions/7364803 / ...
NullUserException

14
@NullUserException ఠ_ఠ Я погоджуюсь, що введення серіалізованих значень у БД абсолютно спалює очі, але ви не знаєте його ситуації - це дуже добре, можливо, є обґрунтованим.
AngryHacker

4
Я думаю, що це питання слід знову відкрити. Це корисне питання для початківців, і я не думаю, що це поза темою.
SaidbakR

1
що робити, якщо деякі значення масиву мають символи |
підсумок

Потім ви можете уникнути цих символів. Прочитайте його тут. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Відповіді:


352

Просто використовуйте implode

implode("|",$type);

13
Це добре, якщо ви не вкладете масиви - що може статися, $_POSTякщо ви використовуєте вхідні форми масиву.
Лейт

з вкладеними масивами просто використовуйте foreach, він буде працювати.
deepcell

224

Ви можете використовувати json_encode ()

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

echo json_encode($arr);
?>

Пізніше просто використовуйте json_decode () для декодування рядка з вашої БД. Все інше марно, JSON зберігає відносини масиву недоторканими для подальшого використання!


40
" Все інше є марним " ... крім, можливо, нормалізації даних.
Дан Лугг

5
Rofl @ коментар над мною. Як ви кажете, бланкові висловлювання майже завжди є безкорисними.
Аарон Коул

12
Я радий, що ви, хлопці, розважаєтесь :)
Якуб

16
"Підмітальні узагальнення, як і абсолюти, завжди помиляються. Завжди". ;)
Олі

Мені подобається, що цей тримає ключі. Це дуже корисно для подальшого використання.
Аполімоксичний

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

ЧОМУ JSON: Ви можете використовувати його з більшістю мов програмування, рядок, створений функцією serialize () php, читається тільки в PHP, і вам не сподобається зберігати такі речі у своїх базах даних, особливо якщо база даних поділяється між додатками, написаними на різні мови програмування


1
JFI в моєму використанні мені довелося зателефонувати $ data = json_decode ($ jsonString, правда)
Термінал

Другий аргумент необов’язковий, в більшості випадків він працює без цього.
підсумок

Це працює для одномірних або багатомірних масивів відмінно, і на мою думку, це має бути прийнятою відповіддю. Також розгляньте додавання true як другого параметра.
Поєднайте

36

Ні, ви не хочете зберігати його як єдину рядок у вашій базі даних.

Ви можете використовувати, serialize()але це зробить ваші дані складнішими для пошуку, складніше працювати і витрачає простір.

Ви також можете зробити якесь інше кодування, але воно, як правило, схильне до тієї ж проблеми.

Уся причина, що у вас є БД, полягає в тому, що ви можете тримати подібну роботу тривіально. Вам не потрібна таблиця для зберігання масивів, вам потрібна таблиця, яку ви можете представляти як масив.

Приклад:

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

Ви б просто вибрати дані з таблиці з SQL, а не мати таблицю, яка виглядає так:

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

Це не так, як ніхто розробляє схему в реляційній базі даних, вона цілком перешкоджає її цілі.


2
впевнений, що це так, вам не доведеться уникати роздільників!
Кріс Г.

2
@MarcB Це робить кодування ідіотом, стандартним, схильним до менших помилок і легко експортується назад до масиву. Чи повинен він використовувати іншу таблицю? Ймовірно. Це краще, ніж всі говорять про прислів? Абсолютно.
інкогніто

6
Правильною відповіддю на це питання буде: не вставляйте серіалізовані значення в RDBMS. Це та річ, яку повинні викликати грабіжники .
NullUserException

1
@timdev: json-Escape може в деяких ситуаціях відповідати виходу SQL, але залежно від цього він просто спалить вас у підсумку. JSON використовує зворотні косої риси - що робити, якщо ви використовуєте БД, який не розпізнає косої риски та використовує подвійні лапки для втечі? наприклад ''замість \'?
Марк Б

1
Хоча я згоден з викладеним тут принципом (нормальні форми хороші, використання БД для структури - це добре, так), будь-яка відповідь, що починається з "Ні, ти не хочеш ...", відбиває дзвони в моїй голові. У вас немає повного контексту питання запитувача, вірте чи ні, вони можуть просто мати відмінний привід денормалізувати ці конкретні дані та зберігати їх в одному полі. Ні, ти не всезнаємий; ви НЕ знаєте, чого хоче той, хто шукає. Поставте свою думку в коментарі , а не відповідь , будь ласка.
система PAUSE

35

Один з найкращих способів:

echo print_r($array, true);

10
розкажіть, будь ласка, свою відповідь, показуючи, як вона вирішує проблему
Наша людина в бананах

1
Ви також можете використовувати: "print_r ($ масив, помилка);", оскільки це буде друкувати масив, не повертаючи значення. Якщо задано значення true, print_r () не буде друкувати самостійно, а просто поверне рядок. Більше за адресою: php.net/manual/en/function.print-r.php
Гаррет

Цей має бути найкращим, оскільки json_decodeпсує формат, що викликає плутанину.
Aminah Nuraini

14

implode () :

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

Однак Incognito має рацію, напевно, ви не хочете зберігати його таким чином - це загальна витрата реляційної потужності вашої бази даних.

Якщо ви готові до серіалізації, ви також можете скористатися json_encode ()


implode обмежується плоскими масивами
ahnbizcad

11

Це дозволяє економити КЛЮЧІ ТА ЦІННОСТІ

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

Сподіваюся, це комусь допоможе.


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

$string_array = json_encode($data);

тепер ви можете вставити це значення $ string_array в базу даних


5

Для зберігання асоціативних масивів ви можете використовувати serialize:

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

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

І завантажуйте, використовуючи unserialize:

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

print_r($arr);

Але якщо вам потрібні створені динамічні .phpфайли з масивом (наприклад, конфігураційні файли), ви можете використовувати ось var_export(..., true);такий:

Зберегти у файлі:

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

Отримати значення масиву:

$arr = include 'config.php';

print_r($arr);

3

Ви можете використовувати рядок PHP implode()

Подібно до,

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

Якщо, наприклад, $sports='football'; $festival='janmastami'; $food='biriyani';

Тоді вихід буде:

football|janmastami|biriyani

Детальніше про функцію PHP implode () див. У w3schools


0

Є багато способів,

два найкращі способи для цього є

$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

Ви повторюєте відповіді, які вже були дані. Це не додає нової цінності чи нових методів.
Цхаллака

@Tschallacka так, але дуже мало відповідей на цю посаду дають вихід ....
Daud Malik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.