Как внутри массива найти значения с разделителем и разбить эти строки?
Здравствуйте, я вывожу из бд значения в цикле, некоторые значения в полях имеют вид «привет|пока|что-то ещё» в итоге имеем 3 значения, но так не во всех полях, а в некоторых, заранее знать их название не получится.
Так вот, как их внутри цикла разложить в формат ключ=значение (key=привет;key=пока;key=что-то ещё;) и дальше продолжить вывод значений, которые не нужно разбивать через explode
вывожу из бд значения в цикле, некоторые значения в полях имеют вид «привет|пока|что-то ещё» в итоге имеем 3 значения, но так не во всех полях, а в некоторых
Ну сразу два вывода.
Первый - БД организована неправильно. Тот, кто её делал, предпочёл не изучить нормальные формы, а высосать структуру из пальца. Получилось ... ну то, что получилось.
Второй - получение тоже организовано неправильно. Сервер БД, при правильно написанном запросе, легко и непринуждённо приведёт все данные к одному знаменателю. И сделает это гораздо быстрее и эффективнее, чем написанный одним программистом код, даже если этот программист гениален.
Итого. Если ещё пока есть возможность - лучше срочно переделать структуру хранения, даже если из-за этого придётся переписать запросы в половине приложения - всё равно экономия будет солидная, особенно на стадии эксплуатации и поддержки.
Что же до решения озвученной задачи без оглядки на её [censored] - можно выполнить последовательный парсинг в рекурсивном CTE, можно использовать синтетическую опорную таблицу чисел для парсинга... можно даже заменами преобразовать в JSON и обработать JSON_TABLE... но ни один из этих способов не будет эффективен.
продолжить вывод значений, которые не нужно разбивать через explode
Для унификации кода - explode-ить всё. Просто то, что не требует разделения, даст на выходе массив из 1 элемента.
В цикле делать explode по разделителю, если полученный массив имеет длину более 1 - вложенный цикл, перебираете полученный массив, если длина = 1 то просто берете само значение.
не нужно проверять длину. Перебирать полученный массив, и неважно, какой он там длины.
P.S. топикстартер имеет в виду, что в каких-то полях "value", а в каких-то "key1=value1;key2=value2" ? Я при первом прочтении не понял. Как же неудобно, когда люди не дают демо-данные
Михаил ЛивачThunderCat Спасибо, но у меня все равно проблема с реализацией, сначала я удаляю пустые значения, затем убираю ненужные значения из запроса, а уже потом привожу значения в тот вид, в котором в дальнейшем надо будет занести в бд. Однако, получается так, что array_filter удаляет и значения типа field_4 = Array, я так понимаю, что их нужно разложить внутри foreach циклом while, именно в таких полях хранятся значения типа "1|2|3|4"
Как во-первых их не удалить или куда перенести array_filter и как конкретно найти потом такие поля 1|2|3|4" и разложить их внутренним циклом чтобы каждое такое значение приобрело вид field_4 = 1;field_4 =2;field_4 =3;field_4 =4; ?
в конечном счете я хотел получить вот такой результат
field_4 = 1;field_4 =2;field_4 =3;field_4 =4;field_5 = привет;field_6 = пока;field_7 = что-то еще;field_7 = что-то еще 1111;
viktorross, вам надо попрактиковать написание тестов. Тогда Вы сразу поймёте, что писать так:
field_4 = 1;field_4 =2;field_4 =3;field_4 =4;field_5 = привет;field_6 = пока;field_7 = что-то еще;field_7 = что-то еще 1111;
контрпродуктивно. Сделайте var_export($list) и напишите сюда. Кроме того, у Вас написано:
var_dump($i);
, но не показан результат этого var_dump() и не показано, что ожидалось ( и опять же, в этом лучше использовать var_export() , это практичнее ).
Для включения корректной подсветки синтаксиса в местом редакторе надо, чтобы вначале стояло "<?php" . Отступы не видны, потому что не использовано оформление кода. Итого, почти вариант выглядит так:
у меня есть код:
<?php
$list = [...]; // вот эту часть надо показать
$del_keys = array('field_1','field_2','field_3');
$i = [];
foreach (array_filter($list,"trim") as $key => $elem) {
if(!in_array($key, $del_keys )) {
$i[$k] = $key.'='.$elem;
}
}
var_export($i); // и вывод вот этого