Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Создание переменных в цикле - как?
цитата
04/10/12 в 20:29
 st01en
Вот примерно код

$m_0=array('a,b,c,d,e' , 'g,h,j,i,k' , 'l,m,n,o,q');
for($i=0;$i<=count($m_0);$i++)
{
$m_.$$i=explode(',',$m_0[$i]);
}

т.е, в результате должно быть 3 массива $m_1, $m_2, $m_3, но нихрена не получается.
цитата
04/10/12 в 20:53
 FTS
Давно не занимался PHP, и сейчас просмотрел по диагонали, но попробуй если хочешь так:
$m_0=array('a,b,c,d,e' , 'g,h,j,i,k' , 'l,m,n,o,q');
for($i=0;$i<=count($m_0);$i++)
{
$m_.{$i}=explode(',',$m_0[$i]);
}


Либо ${$i}
цитата
04/10/12 в 21:00
 FTS
Скорее второй вариант icon_cool.gif
цитата
04/10/12 в 23:08
 FXIX
<?php

$m_0 = array('a,b,c,d,e', 'g,h,j,i,k', 'l,m,n,o,q');

foreach ($m_0 as $v) {
$result[] = explode(',', $v);
}
print_r($result);
цитата
04/10/12 в 23:42
 st01en
сенкс, второй вариант. последнее не понял к чему icon_biggrin.gif
в продолжение - как получить размер новых массивов?

$m_0=array('a,b,c,d,e' , 'g,h,j,i,k' , 'l,m,n,o,q');
for($i=0;$i<=count($m_0);$i++)
{
$m_.${$i}=explode(',',$m_0[$i]);
echo count($m_.${$i});
}

почему-то всегда выводит 1
цитата
05/10/12 в 00:15
 Stek
st01en: а зачем ты вообще так извращаешься с именами массивов ? Так не делают, ты только зря память и операции тратишь на копии данных. Плюс код жутко не читабельный.

Код:

<?php
$array = array(
    'a,b,c,d,e',
    'g,h,j,i,k',
    'l,m,n,o,q',
);

foreach ($array as $string) {
    $sub_array = explode(',', $string);
    print 'Elemnts count: '.count($sub_array).'<br />';
}
цитата
05/10/12 в 00:33
 st01en
ну скажем цель такая - разобрать текст в массив построчно, потом строки разбить по словам, - каждая строка получается новый массив? Потом надо определить длинну каждого массива, найти самый большой и вывести все это дело в таблицу, где кол-во строк = длине самого большого массива. как это можно организовать? причем кол-во слов и предложений в тексте неизвестно.
('a,b,c,d,e', 'g,h,j,i,k', 'l,m,n,o,q') - это только для примера.
цитата
05/10/12 в 00:52
 Stek
Про таблицу по длине масива не понял. Но примерно так.

Код:

<?php
$text = "
Еще два человека, которых задержали вместе с остальными, были отпущены из полиции без составления протоколов.
Это Николай Кузнецов и Эльвира Ганиева.
Почему их не заподозрили в нарушении КоАП, не уточняется.
";

$text = explode("\n",trim($text));

// инициализируем начальные данные
$long_string = '';
$string_length = 0;

foreach ($text as $string) {
    $current_length = strlen($string);
    if ($string_length > $current_length) { continue; }

    // если текущая строка длиннее, то выбираем ее.
    // иначе до сюда скрипт не дойдет а вернется в начало
    // по continue;
    $string_length = $current_length;
    $long_string = $string;
}

print "Самая длинная строка из {$string_length} символов: <br />{$long_string}";
цитата
05/10/12 в 08:10
 st01en
Stek: Да я знаю, как получить длину массива icon_biggrin.gif Задача несколько другая. Вот для примера,

Код:
$text = 'Рыба:Карась,Карп,Окунь,Щука, Лящ. Сыр:Голландский, Российский, Плавленный. Мясо:Свинина, Говядина, Баранина, Кошатина.';


В результате нужно вывести вот такую таблицу -
Код:

           Рыба          Сыр           Мясо
           Карась        Голландский   Свинина
           Карп          Российский    Говядина
           Окунь         Плавленный    Баранина
           Щука                        Кошатина
           Лящ


Причем - именно таблицу с бордюром icon_biggrin.gif
Как заменить : и убрать пробелы я тоже знаю icon_biggrin.gif Интересует именно динамическое создание массивов и потом возможность с ними работать. Потому что изначально неизвестно, сколько в тексте строк, слов и т.д icon_biggrin.gif
цитата
05/10/12 в 09:01
 Stek
Таблицу с бордюром - это тебе в html уже smail101.gif

А так у тебя 3 варианта для парсинга.
1. Разделять строки по explode()
2. strstr() или strpos() искать точки как конец строки
3. воспользоваться preg_match функцией и парсить регулярками.
цитата
05/10/12 в 10:39
 st01en
Спасибо за наводку по сравнению массивов icon_biggrin.gif Вот собственно код, который делает то, что нужно
<?php

$text = 'Рыба:Карась,Карп,Окунь,Щука, Лящ,Тюлька. Сыр:Голландский, Российский, Плавленный. Мясо:Свинина, Говядина, Баранина, Кошатина.';
$text_1 = str_replace(':',',',$text);
$m=explode('.',$text_1);
$col=count($m)-1;
for($i=0;$i<=$col;$i++)
{
$m_.${$i}=explode(',',$m[$i]);
}


$max = 0;
foreach ($m as $string) {
    $sub_array = explode(',', $string);
    $current_count = count($sub_array);
    if ($max > $current_count) { continue; }
    $max = $current_count;
}
echo '<table border="1"><tr>';
for($k=0;$k<=$col-1;$k++)
{
echo '<td>'.$m_.${$k}[0].'</td>';
}
echo '</tr>';


for($c=1;$c<=$max;$c++)
{
echo '<tr>';
    for($t=0;$t<=$col-1;$t++)
   {
      $var=$m_.${$t}[$c];
      echo '<td>'.trim($var).'</td>';
      }
      echo '</tr>';
      }

  echo '</table>';

?>

Но мне интересно - может быть есть какое-то более оптимальное решение?
цитата
05/10/12 в 16:52
 FXIX
$text = 'Рыба:Карась,Карп,Окунь,Щука,Лящ,Тюлька. Сыр:Голландский,Российский,Плавленный. Мясо:Свинина,Говядина,Баранина,Кошатина.';
$text = explode('.', $text);

foreach ($text as $k => $v) {
if (empty($v)) {
continue;
}
preg_match("~(.*?):~isu", $v, $matches);
$v = preg_replace("~(" . $matches[0] . ")~isu", '', $v);
$result[] = array('head' => $matches[1], 'items' => explode(',', $v));
}
echo '<pre>';
print_r($result);

далее вывод в таблицу
цитата
05/10/12 в 21:42
 Sterx
FXIX:
а preg_match пошто??? где xpath где simple где твои библы??
вот они двойные стандарты в действии.
цитата
05/10/12 в 22:32
 FXIX
Sterx писал:
FXIX:
а preg_match пошто??? где xpath где simple где твои библы??
вот они двойные стандарты в действии.


а могу все объяснить.

там где ты предлагал юзать регулярки:
- написаны дохуя удобных либ. приводящих код в простому виду. по-сути к css-селекторам. ты же предлагал выпарсивать из непонятно какой верстки (в общем случае - невалидной, с вложенными-перевложенными селекторами) регулярками. т.е. переписывать написанное. не секрет что такого уровня регулярки - просто так не напишешь. без литра водки и такой-то матери.

- регулярка вида "(.*?):" понятна даже нубу. тут невозможно ошибиться, в отличие от регулярок которые надо написать чтобы выпарсить из верстки. потом в них также невозможно разобраться.

- ну и это. у меня кода меньше smail101.gif


Эта страница в полной версии