помогите с использованием php explode () и организуйте вывод - PullRequest
0 голосов
/ 16 августа 2010

Может кто-нибудь показать мне, как правильно отобразить это? Я пытаюсь понять, как использовать php explode () и организовать значения таким образом, чтобы я мог получить и напечатать их в некотором организованном вопросе. Для каждой записи я хочу поместить имя = значение в конкретный сегмент. У меня (7) макс ведра на запись. Иногда у меня есть записи, которые не заполняют каждое ведро.

(например, в записи (2) отсутствуют атрибуты (5,6,7), а в записи (3) отсутствует атрибут (4)).

1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=db9.nfl.colo2.;4-Column=00:00:03;5-Column=01:55:02;6-Column=87.24 MB;7-Column=Success;
1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=pdb2.colo2.;4-Column=04:00:02;
1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=gl3_lvm;5-Column=04:48:06;6-Column=54.64 MB;7-Column=Success;

Пока я написал это, чтобы просмотреть мой вывод:

<?php
$InputFile = file("test.txt");
foreach ($InputFile as $line){
    $pieces = explode(";", $line);
         //print $pieces[0];
         //print $pieces[1];
         //print $pieces[2];
         print $pieces[3];
         //print $pieces[4];
         //print $pieces[5];
         //print $pieces[6];
//print_r($line);
}
?>

Я хотел бы распечатать аналогичные значения для каждого атрибута вместо того, где он смешан. Использование 'print $ piece [3];'

4-Column=00:00:034-Column=04:00:025-Column=04:48:06

Ответы [ 4 ]

2 голосов
/ 16 августа 2010
<code>$InputFile = file("test.txt");
foreach ($InputFile as $line){
  preg_match('~(1-Column[^;]*;?)?(2-Column[^;]*)?;?(3-Column[^;]*)?;?(4-Column[^;]*)?;?(5-Column[^;]*)?;?(6-Column[^;]*)?;?(7-Column[^;]*)?;?~',$line,$pieces);
  $pieces = array_pad($pieces,8,'');
  echo "<pre>";print_r($pieces);echo "
"; }

выход:

Array
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=db9.nfl.colo2.;4-Column=00:00:03;5-Column=01:55:02;6-Column=87.24 MB;7-Column=Success;
    [1] => 1-Column=host1.colo.sub;
    [2] => 2-Column=Fri Aug 13
    [3] => 3-Column=db9.nfl.colo2.
    [4] => 4-Column=00:00:03
    [5] => 5-Column=01:55:02
    [6] => 6-Column=87.24 MB
    [7] => 7-Column=Success
)

Array
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=pdb2.colo2.;4-Column=04:00:02;
    [1] => 1-Column=host1.colo.sub;
    [2] => 2-Column=Fri Aug 13
    [3] => 3-Column=pdb2.colo2.
    [4] => 4-Column=04:00:02
    [5] => 
    [6] => 
    [7] => 
)

Array
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=gl3_lvm;5-Column=04:48:06;6-Column=54.64 MB;7-Column=Success;
    [1] => 1-Column=host1.colo.sub;
    [2] => 2-Column=Fri Aug 13
    [3] => 3-Column=gl3_lvm
    [4] => 
    [5] => 5-Column=04:48:06
    [6] => 6-Column=54.64 MB
    [7] => 7-Column=Success
)
0 голосов
/ 16 августа 2010

Хотя не совсем ясно, чего вы пытаетесь достичь, надеюсь, этот код поможет вам понять, что происходит.

Обратите внимание, что здесь, я добавил еще один цикл в основной foreach, чтобы перебрать каждую пару имя / значение в строке:

<?php
$InputFile = file("test.txt");
$lineCnt = 0;
foreach ($InputFile as $line){
    $lineCnt++;
    echo "Processing line #" . $lineCnt. "\n";
    $pieces = explode(";", $line);
    foreach($pieces as $pair){
    $pair = explode('=',$pair);
        if (!empty($pair[1])){
            print "\t".$pair[0] .' = ' . $pair[1] . "\n";
        }
    }

}

Сценарий выдаст красивый вывод при запуске из командной строки. Если вы запускаете его в браузере, вы можете изменить \ n на
, а \ t на или что-то в этом роде.

0 голосов
/ 16 августа 2010

Посмотрите, поможет ли это ...

$splits = explode(';',$_POST['data']);
foreach($splits as $id => $item) {
    preg_match('/(.*?)=(.*)/',$item, $matches);
    $parts[$matches[1]][] = $matches[2];
}
print_r($parts);

Это даст вам массив с ключами в виде 1-столбца, 2-столбца и т. Д., Который будет содержать массив связанных значений. Вы можете распечатать этот массив любым способом.

Вот вывод:

[1-Column] => Array
    (
        [0] => host1.colo.sub
        [1] => host1.colo.sub
        [2] => host1.colo.sub
    )

[2-Column] => Array
    (
        [0] => Fri Aug 13
        [1] => Fri Aug 13
        [2] => Fri Aug 13
    )

[3-Column] => Array
    (
        [0] => db9.nfl.colo2.
        [1] => pdb2.colo2.
        [2] => gl3_lvm
    )

[4-Column] => Array
    (
        [0] => 00:00:03
        [1] => 04:00:02
    )

[5-Column] => Array
    (
        [0] => 01:55:02
        [1] => 04:48:06
    )

[6-Column] => Array
    (
        [0] => 87.24 MB
        [1] => 54.64 MB
    )

[7-Column] => Array
    (
        [0] => Success
        [1] => Success
    )
0 голосов
/ 16 августа 2010

Если ваши входные данные настолько нерегулярны, вам нужно либо проанализировать их с небольшим количеством кода, а не просто разобрать, или подготовить так, чтобы они работали с разнесением должным образом.

Во второмcase, вы можете использовать strpos чтобы найти все ";"символы в строке и проверьте, в порядке ли число после них.Если один (или более) номер был пропущен, вы должны компенсировать это, вставив еще один «;».Таким образом, Explode создаст пустой элемент массива, и все полученные массивы должны быть выровнены.

...