Отформатируйте текстовые значения в столбцах, используя \ t в php - PullRequest
1 голос
/ 02 июня 2011

У меня есть следующий код в php, когда я его выполняю:

<code><pre>
<?php
$input = '<xml>
<user>
    <name>sujit agarwal</name>
    <age>22</age>
    <gender>male</gender>
</user>
<user>
    <name>ajay rana</name>
    <age>25</age>
    <gender>male</gender>
</user>
<user>
    <name>pratap singh</name>
    <age>27</age>
    <gender>male</gender>
</user>
<user>
    <name>asdfasdfasdfasdf</name>
    <age>30</age>
    <gender>male</gender>
</user>
</xml>';
$sx = simplexml_load_string($input);
foreach($sx as $val)
echo $val->name."\t".$val->gender."\t".$val->age."\n";
?>

ВЫХОД ЕСТЬ

sujit agarwal   male    22
ajay rana   male    25
pratap singh    male    27
asdfasdfasdfasdf    male    30

Теперь моя проблема состоит в том, как выровнять все значения пола и возраста в столбце, даже если имя длиннее, чем остальные. Надеюсь, я прояснил свою проблему. Это должно быть сделано в тегах PRE. потому что позже я сохраню это в файл TXT

НЕОБХОДИМОЕ ФОРМАТИРОВАНИЕ

sujit agarwal       male    22
ajay rana           male    25
pratap singh        male    27
asdfasdfasdfasdf    male    30

Ответы [ 4 ]

1 голос
/ 18 мая 2014

Мне просто нужно было быстро разобраться с этим для сценария оболочки, метод довольно переносим.

Просто передайте массив элементов с разделенной вкладкой столбцов - и он вернет отформатированную строку справильно расположенные столбцы.

function function formatCols($rows)
{
  $colwidth = array();
  $rowsParts = array();
  $results = null;
  foreach ($rows as $row) {
    $cols = explode("\t", $row);
    $rowsParts[] = $cols;
    foreach ($cols as $id => $col)
      if (!isset($colwidth[$id]) || strlen($col) > $colwidth[$id])
        $colwidth[$id] = strlen($col);
  }
  $colFormat = null;
  for ($i=0; $i<count($colwidth); $i++)
    $colFormat .= '%-'.$colwidth[$i].'s ';
  $colFormat = trim($colFormat)."\n";
  foreach ($rowsParts as $row)
    $results .= vsprintf($colFormat, $row);
  return $results;
}
1 голос
/ 02 июня 2011
<code><?php
$input = '<xml>
<user>
    <name>sujit agarwal</name>
    <age>22</age>
    <gender>male</gender>
</user>
<user>
    <name>ajay rana</name>
    <age>25</age>
    <gender>male</gender>
</user>
<user>
    <name>pratap singh</name>
    <age>27</age>
    <gender>male</gender>
</user>
<user>
    <name>asdfasdfasdfasdf</name>
    <age>30</age>
    <gender>male</gender>
</user>
</xml>';
$sx = simplexml_load_string($input);

$output='';
foreach($sx as $val){
    $values[] = $val->name;
    $values[] = $val->gender;
    $values[] = $val->age;
    $output.=vsprintf("%-30s %s\t %d",$values)."\n";
    $values='';
}

echo '<pre>';
echo $output;
echo '
'; ?>

выходы:

sujit agarwal                  male  22
ajay rana                      male  25
pratap singh                   male  27
asdfasdfasdfasdf               male  30
0 голосов
/ 02 июня 2011

Вам придется выполнить цикл дважды: 1, чтобы установить максимальную длину каждого отдельного поля, и второй, чтобы записать его с таким большим количеством пробелов (для которого я бы порекомендовал что-то вроде vsprintf('%45s %7s %-3d',$args); или что-то еще значения могут быть.

0 голосов
/ 02 июня 2011

Это не так уж сложно.

Что вам нужно сделать, так это выяснить, насколько широким является каждый столбец. А затем выясните, сколько вкладок вам нужно добавить к нему. Таким образом, вам нужно будет пройти через все строки дважды. Сначала для каждого столбца определите, какое значение шире, а затем «распечатайте» данные плюс нужное количество вкладок.

Или вы можете просто использовать таблицы HTML, которые позаботятся об этом за вас, но я понимаю, что это не вариант.

...