Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Implode и explode. Постинг данных в одну колонку и циклическая выборка.

Implode и explode. Постинг данных в одну колонку и циклическая выборка.


     15.02.2013    php, MySQL    Все вопросы » Общие вопросы по PHP    3907

вопрос
Здравствуйте.

Есть задача, которая подразумевает собой вывод данных в две таблицы. Первая статическая и имеет 8 значений. Вторая - динамическая, может иметь от 1 строки (по 7 столбцов в каждой).

В БД добавляю все в одно поле так:
<input type="text" name="name[]" />
$name = implode('=|=', $_POST['name']);
В первую таблицу (та которая статическая, с известным кол-вом значений, помните?) данные вывожу очень просто:
$result = explode('=|=', $row['name']);
и далее (использую DLE) создаю макросы для шаблона по такому типу:
$tpl->set('{macros}', $result[0]);
Для статической таблицы все Ок - создал необходимое кол-во макросов и забыл, а вот как быть с динамикой?

Спасибо за любые идеи и подсказки.

/// UPD:
$statistics = array();
$statistics = explode('=|=', $row['statistics']);

$line = array($statistics);
$count_lines = count($line);

for($i = 0; $i <= $count_lines; $i++) {

    $result .= '<a class="row clr">';

    $count_lines = count($line[$i]);

    for($q = 0; $q < $count_lines; $q++) {
        $result .= '<span>'. $line[$i][$q] .'</span>';
    }

    $result .= '</a>';
}

$tpl->set('{statistics}', $result);
/// UPD:
Сразу же хочу спросить еще об одном. На данный момент в строке 7 значений разделяющихся "=|=". Но помимо этого, в некоторых полях есть разделитель " || ". Как выводить текст до разделителя по условию?

Объясню наглядно:

"Голая" строка:
1=|=2=|=3 || three=|=4 || four=|=5 || five=|=6=|=7

Она же, но ставшая строкой таблицы:
1 2 3 || three 4 || four 5 || five 6 7

Конечное преобразование если условие соблюдается:
1 2 3 4 5 6 7

Если не соблюдается:
1 2 three four five 6 7

Ответил: BR0kEN


Сделал все что было нужно таким способом:
$statistics = array(); // переменная - массив
$statistics = explode('=|=', $row['statistics']); // удаление разделителей
$line = array_chunk($statistics, 7); // разбитие массива на равные части

foreach ($line AS $key => $value) {

    $result .= '<a class="row clr">';

    foreach ($line[$key] AS $key1 => $value1) {

        // если есть кука "ru", то в колонках 3, 4 и 5 выводится текст до ||, нету - после
        if ($key1 == 2 OR $key1 == 3 OR $key1 == 4) {
    
            $locale = explode(' || ', $line[$key][$key1]);

            if ($_COOKIE['language'] == 'ru') $line[$key][$key1] = $locale[0];
            else $line[$key][$key1] = $locale[1];
        
        }

        if ($key1 == 6) $result .= '<span class="'. $line[$key][$key1] .'"></span>';
        else $result .= '<span>'. $line[$key][$key1] .'</span>';

    }

    $result .= '</a>';

}

$tpl->set('{statistics}', $result);
Теперь, допустим, в поле таблицы из БД есть запись:
15.02.13=|=20:45=|=Русский текст || English text=|=Русский текст || English text=|=РТ || ET=|=2.0=|=plus=|=16.02.13=|=20:45=|=Русский текст || English text=|=Русский текст || English text=|=РТ || ET=|=2.0=|=minus=|=15.02.13=|=20:45=|=Русский текст || English text=|=Русский текст || English text=|=РТ || ET=|=2.0=|=equally
Вывод ее, по-умолчанию, будет таков (если есть языковая кука с именем ru):
Implode и explode. Постинг данных в одну колонку и циклическая выборка.

Если же куки нет, то:
Implode и explode. Постинг данных в одну колонку и циклическая выборка.


Всем премного благодарен. Обсуждение - двигатель.

з.ы. Если вы видите в коде недочеты, то укажите их. Скорее всего они есть.

10 комментариев

Sander
PHP-developer

Sander - 15 февраля 2013 03:46 -

Дык двумерный массив применяй. Делай 2 explode-а, а потом цикл в цикле...

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

BR0kEN
Эксперт

BR0kEN - 15 февраля 2013 06:33 -

И правда "гуд айдиа". Столкнулся с небольшой задачкой с массивами. Не могу разбить данные на строки. Изначально все "пишется" в одну, а далее создаются пустые строки. Добавил код в вопрос, прошу помощи.

ПафНутиЙ
Админ

ПафНутиЙ - 15 февраля 2013 09:30 -

А чем foreach() не устраивает?
Я конечно может не догоняю чего - то, но зачем напрягать count`ами двиг?
<?php 
    $statistics = array();
    $statistics = explode('=|=', $row['statistics']);
    $line = array($statistics);
    
    foreach ($line as $key => $value) {
        $result .= '<a class="row clr">';

        foreach ($line[$key] as $key1 => $value1) {
            $result .= '<span>'. $line[$key][$key1] .'</span>';
        }
        $result .= '</a>';
    }
    $tpl->set('{statistics}', $result);
?>

Каков вопрос - таков и ответ. Просто помните об этом.

nowheremany
Эксперт

nowheremany - 15 февраля 2013 09:41 -

Но самом деле foreach проигрывает в скорости for.
Но лично мне пофигу, ибо сервера сейчас не такие томознутые, чтобы экономить на спичках

Ps
    
if(is_array($line))
foreach ($line as $key => $value) {
        $result .= '<a class="row clr">';
if(is_array($value))
        foreach ($value as $key1 => $value1) {
            $result .= '<span>'. $value1 .'</span>';
        }
        $result .= '</a>';
    }

Благодарность принимаю тут Связь

BR0kEN
Эксперт

BR0kEN - 15 февраля 2013 09:45 -

ПафНутиЙ, for() или foreach() - не столь важно. Я не знаю как разделить данные по строкам. Есть у меня в БД такое значение: 1=|=2=|=3=|=4=|=5=|=6=|=7=|=1=|=2=|=3=|=4=|=5=|=6=|=7. На деле это две сроки таблицы, а выводиться все в одну.

nowheremany
Эксперт

nowheremany - 15 февраля 2013 09:48 -

дык - записал неправильно. Каким вот образом ты понял что здесь 2 строки? я а вот не понимаю, почему их 2

Да и вообще посмотри реализацию доп полей в ДЛЕ - там такой же механизм

Благодарность принимаю тут Связь

nowheremany
Эксперт

nowheremany - 15 февраля 2013 09:52 -

ДА и ещё одно - если нужно просто хранить serialize и unserialize помогут

Благодарность принимаю тут Связь

BR0kEN
Эксперт

BR0kEN - 15 февраля 2013 10:24 -

Посмотрел, но, к сожалению, ничего не понял. Прошу вас (или кого другого), по возможности, привести пример для такого формата, как использую я.

Я пробовал explode в циклах, но черт, никак не могу разбить данные по строкам - все сваливается в одну.

Sander
PHP-developer

Sander - 15 февраля 2013 11:29 -

$fucking_big_array = array(
  array('1','2','3'.null,'4','123'),
  array('s','d','2','5','f','q'),
);
$result = serialize($fucking_big_array);


На выходе получим весь тот массив, что задан (многомерность не имеет значения), только уже в одну строку в текстовом формате.

Затем эту же строку раскодируем обратно в массив функцией:
$again_fucking_big_array = unserialize($result);



UPD: Или костыляем explode-ами :)
$str = "1=|=2=|=3 || three=|=4 || four=|=5 || five=|=6=|=7";
$first_arr = explode(" || ",$str);
$result = array();
foreach($first_arr as $v){
  $result[] = explode("=|=",$v);
}

Опять же на выходе получим двумерный массив...

Но в чем преимущество serialize, то что он полностью сохраняет структуру массива, включая ключи и очередность. Минус его применения лишь в том, что закодированную часть вручную не подправить как текст.

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

Sander
PHP-developer

Sander - 15 февраля 2013 13:32 -

BR0kEN, Тебе только обфускаторы писать xD

Я бы так делал:
<?php
/* В базе хранится serialize вариант:
a:3:{i:0;a:7:{i:0;s:8:"15.02.13";i:1;s:5:"20:45";i:2;a:2:{i:0;s:13:"Русский текст";i:1;s:12:"English text";}i:3;a:2:{i:0;s:13:"Русский текст";i:1;s:12:"English text";}i:4;a:2:{i:0;s:2:"РТ";i:1;s:2:"ET";}i:5;s:3:"2.0";i:6;s:4:"plus";}i:1;a:7:{i:0;s:8:"16.02.13";i:1;s:5:"20:45";i:2;a:2:{i:0;s:13:"Русский текст";i:1;s:12:"English text";}i:3;a:2:{i:0;s:13:"Русский текст";i:1;s:12:"English text";}i:4;a:2:{i:0;s:2:"РТ";i:1;s:2:"ET";}i:5;s:3:"2.0";i:6;s:5:"minus";}i:2;a:7:{i:0;s:8:"17.02.13";i:1;s:5:"20:45";i:2;a:2:{i:0;s:13:"Русский текст";i:1;s:12:"English text";}i:3;a:2:{i:0;s:13:"Русский текст";i:1;s:12:"English text";}i:4;a:2:{i:0;s:2:"РТ";i:1;s:2:"ET";}i:5;s:3:"2.0";i:6;s:7:"equally";}}
Поэтому:
$statistics = unserialize($static_result['statistics']);
*/

/* Дано, то же что выдаст unserialize() */
$statistics = array(
    array('15.02.13','20:45',array("Русский текст","English text"),array("Русский текст","English text"),array("РТ","ET"),'2.0','plus'),
    array('16.02.13','20:45',array("Русский текст","English text"),array("Русский текст","English text"),array("РТ","ET"),'2.0','minus'),
    array('17.02.13','20:45',array("Русский текст","English text"),array("Русский текст","English text"),array("РТ","ET"),'2.0','equally'),
);

/* Ибо нефиг */
$result = "";

/* Проверяем езыг  */
if ($_COOKIE['language'] == 'ru') $lang_key = 0;
else $lang_key = 1;

/* Разбираем построчно */
foreach( $statistics as $v ){
    $result .= "<a class=\"row clr\"><span>{$v[0]}</span><span>{$v[1]}</span><span>{$v[2][$lang_key]}</span><span>{$v[3][$lang_key]}</span><span>{$v[4][$lang_key]}</span><span>{$v[5]}</span><span class=\"{$v[6]}\"><span></a>\n";
}

$tpl->set('{statistics}', $result);
?>


По сути, весь обработчик состоит из 5и строк :)

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх