многомерный массив — Как удалить несколько пробелов в многострочном текстовом файле в Stack Overflow

У меня есть текстовый файл, который содержит строки, разделенные «\ 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);

?>

0

Решение

Простой ответ, используйте 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(); то есть он принимает свои аргументы и помещает переменные с этими именами в ассоциативный массив.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]