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


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

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 ()


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 да, но очень немногие ответы на этот пост обеспечивают вывод ....
Дауд Малик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.