У меня есть текстовый файл, который содержит строки, разделенные «\ n» и пробелы между каждым элементом. Элементы разделены одним или несколькими пробелами. Тем не менее, пустое расстояние между элементами одинаково для каждой строки.
FRUIT WATER GRE LRG 0003 050
FRUIT BANAN YEL MED 0017 010
FRUIT STRAW RED SML 0005 005
FRUIT LEMON YEL SML 0024 005
VEGIE REDPE RED MED 0008 001
VEGIE GRENP GRE MED 0009 001
BOX RED 006 012 018
BOX YEL 010 020 030
BOX GRE 003 006 009
PERSON JOHN TALL STRG
PERSON JIMM MEDM WEAK
PERSON DAVD MEDM STRG
Я пытаюсь разобрать этот файл с помощью PHP. Следующий код дает массив с множеством пробелов.
if(file_exists($filename)) {
$filecontents = file_get_contents($filename);
$lines = explode("\n", $filecontents);
foreach ($lines as $line) {
$exploded = explode(" ", $line);
if (sizeof($exploded) >= 5 and $exploded[0] == 'FRUIT') $array[] = array(
'type' => $exploded[1],
'color' => $exploded[2],
'size' => $exploded[3],
'qty' => $exploded[4],
'weight' => $exploded[5]
);
if (sizeof($exploded) >=5 and $exploded[0] == 'VEGIE') $array[] = array(
'type' => $exploded[1],
'color' => $exploded[2],
'size' => $exploded[3],
'qty' => $exploded[4],
'weight' => $exploded[5]
);
if (sizeof($exploded) >= 5 and $exploded[0] == 'BOX') $array[] = array(
'color' => $exploded [1],
'largefit' => $exploded[2],
'medfit' => $exploded[3],
'smallfit' => $exploded[4]
);
if (sizeof($exploded) >= 4 and $exploded[0] == 'PERSON') $array[] = array (
'name' => $exploded[1],
'build'=> $exploded[2],
'strength' => $exploded[3]
);
}
}
print_r($array);
?>
Простой ответ, используйте trim()
на все ваши значения перед их сохранением:
'type' => trim($exploded[1]),
Но эта работа — то, что вы можете сделать более эффективно с регулярные выражения. Также обратите внимание на file()
Команда автоматически считывает файл в массив!
<?php
if(file_exists($filename)) {
$array = [];
$lines = file($filename);
foreach ($lines as $line) {
if (!preg_match("/(\w+)\s+(\w+)\s+(\w+)\s+(\w+)(?:(?:\s+(\w+))?\s+(\w+))?/", $line, $matches)) {
continue;
}
switch ($matches[1]) {
case "FRUIT":
case "VEGGIE":
list($foo, $bar, $type, $color, $size, $qty, $weight) = $matches;
$array[] = compact("type", "color", "size", "qty", "weight");
break;
case "BOX":
list($foo, $bar, $color, $largefit, $medfit, $smallfit) = $matches;
$array[] = compact("color", "largefit", "medfit", "smallfit");
break;
case "PERSON":
list($foo, $bar, $name, $build, $strength) = $matches;
$array[] = compact("name", "build", "strength");
break;
}
}
}
print_r($array);
compact()
Команда противоположна extract()
; то есть он принимает свои аргументы и помещает переменные с этими именами в ассоциативный массив.
Других решений пока нет …