Массив в строковый PHP?

284

Каков наилучший метод для преобразования массива 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

Ответы:

353

Используйте взорваться

implode("|",$type);
Нит Тёмный Абсол
источник
13
Это хорошо, если у вас нет вложенных массивов - что может случиться, $_POSTесли вы используете входные данные с именами массивов.
Лейт
с вложенными массивами просто используйте foreach, это будет работать.
Deepcell
225

Вы можете использовать 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, и вам не понравится хранить такие вещи в ваших базах данных, особенно если база данных используется совместно приложениями, написанными на разные языки программирования

Sumit
источник
1
При использовании JFI мне пришлось вызывать $ data = json_decode ($ jsonString, true)
Terminality
Второй аргумент является необязательным, в большинстве случаев он работает без этого.
Саммит
Это работает для одно- или многомерных массивов отлично, и, на мой взгляд, это должен быть принятый ответ. Также рассмотрите возможность добавления 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);
vvkatwss vvkatwss
источник
10
Пожалуйста, подробно опишите свой ответ, показывая, как это решает проблему
Наш человек в бананах
1
Вы также можете использовать: «print_r ($ array, false);», так как это будет печатать массив без возврата значения. Если задано значение true, print_r () не будет печататься самостоятельно и просто вернет строку. Больше на: php.net/manual/en/function.print-r.php
Гарретт
Это должно быть лучшим, так как json_decodeпутается с форматом, вызывающим путаницу.
Амина Нурайни
14

implode () :

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

Тем не менее, Incognito прав, вы, вероятно, не хотите хранить его таким образом - это полная трата реляционных возможностей вашей базы данных.

Если вы не уверены в сериализации, вы можете также рассмотреть возможность использования json_encode ()

timdev
источник
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


источник
1

Есть много способов ,

Два лучших способа для этого

$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 да, но очень немногие ответы на этот пост обеспечивают вывод ....
Дауд Малик