Помогите использовать PHP взорваться () и организацию выхода
-
28-09-2019 - |
Вопрос
Может ли кто-нибудь, пожалуйста, покажу мне, как правильно сопоставить? Я пытаюсь понять, как использовать PHP взрываться () и организовывать значения таким образом, чтобы я мог получить и распечатать их в некоторых организованных вопросах. Для каждой записи я хочу поставить имя = значение в конкретном ведре. У меня есть (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 $ pieces [3];
4-Column=00:00:034-Column=04:00:025-Column=04:48:06
Решение
$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 "</pre>";
}
выход:
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
)
Другие советы
Если ваши входные данные настолько нерегулярны, вам будет либо необходимо, чтобы разбирать его с немного большего количества кода, а не просто простой взорвании, либо подготовить его так, чтобы он работает, как ожидается, и взорвании.
Во втором случае вы могли бы использовать строение найти все ";" символы в строке и проверьте, если номер за ними находится в порядке. Если один (или более) номер был пропущен, вы должны компенсировать, вставляя другой «;». Этот путь взорвании создаст пустой элемент массива, и все ваши результирующие массивы должны быть выровнены.
Хотя не совсем понятно, что вы пытаетесь выполнить, надеюсь, этот код может помочь вам выяснить, что происходит.
Обратите внимание, что здесь я добавил еще один цикл внутри основного 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 to или что-то.
Посмотрите, поможет ли это ...
$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
)