Мне нужно вставить данные в таблицу .. данные поступают из разных источников. Вот мой код.

$title = array(Book A, Book B, Book C);
$number = array(2,1,4);
$lines = array(Maria, Smith, Abner);

for($i=1; $i<count($lines); $i++)
{
   print '<tr>';
   print '<td>'.$title[$i].'</td>';
   print '<td>P'.$number[$i].'</td>';
   print '<td>['.$lines[$i].']</td>';
   print '<td></td>';
   print '</tr>';
}

Кажется, не работает: / массив неправильно отображается в моей таблице.

Я ожидаю следующего вывода:

------------------------------------------------
| Title     |    No    | Lines       | Remarks |
------------------------------------------------
| Book A    |    2     | Maria       |         |
| Book B    |    1     | Smith       |         |
| Book C    |    4     | Abner       |         |
------------------------------------------------

На данный момент .. Я получаю следующий результат:

------------------------------------------------
| Title     |    No    | Lines       | Remarks |
------------------------------------------------
|  Book A   |    2     | Maria       |         |
|           |          | Smith       |         |
|           |          | Abner       |         |
------------------------------------------------
0
Julie 20 Апр 2016 в 06:56

5 ответов

Лучший ответ

Если ваши массивы имеют разные ключи, вы можете «сбросить» их до нуля. Просто используйте $array = array_values($array). Цитата из manual

array_values () возвращает все значения из массива и индексирует массив численно.

После этого ваш код будет работать. Вот как можно изменить ваш пример:

$title = array('Book A', 'Book B', 'Book C');
$number = array("a" => 2, "b" => 1, "c" => 4);
$lines = array('Maria', 'Smith', 7 => 'Abner');
/* At this point you have some arrays with unknown keys.
   It can be [0 => item, 1 => item2] or ['name' => item, 'name2' => item2]
   or even with skipped keys [0 => item, 7 => item2]
*/


// Reset keys for all arrays. Now all arrays will contain keys 0, 1, 2 etc.
$title = array_values($title);
$number = array_values($number);
$lines = array_values($lines);

for($i = 0; $i < count($lines); $i++) // Note, arrays now are zero-based, you must start from $i = 0
{
    print '<tr>';
    print '<td>'.$title[$i].'</td>';
    print '<td>P'.$number[$i].'</td>';
    print '<td>['.$lines[$i].']</td>';
    print '<td></td>';
    print '</tr>';
}
2
Frankie 21 Апр 2016 в 00:45

Вы просто положили i = 0; потому что массив начался с индекса 0 и попробуйте следующий код, это может помочь вам.

    <?php $title = array('Book A','Book B','BookC');$number = array('2','1','4');$lines = array('Maria','Smith','Abner');for($i=0;$i<count($lines); $i++){print '<tr>';print '<td>'.$title[$i].'</td>';print '<td>P'.$number[$i].'</td>';print'<td>['.$lines[$i].']</td>';print '<td></td>'; print '</tr>'; } ?>
1
JYoThI 20 Апр 2016 в 05:24

Есть хитрый трюк для объединения отдельных массивов с array_map(), если вы передаете null в качестве первого аргумента, за которым следуют массивы, которые вы хотите объединить.

Как указано в примере № 4 в документации:

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

Используя ваш пример для контекста:

<?php

$titles  = ['Book A', 'Book B', 'Book C'];
$numbers = [2,1,4];
$lines   = ['Maria', 'Smith', 'Abner'];

// create an 'array of arrays'
$rows = array_map(null, $titles, $numbers, $lines);

var_dump($rows);

Урожайность:

array (size=3)
  0 => 
    array (size=3)
      0 => string 'Book A' (length=6)
      1 => int 2
      2 => string 'Maria' (length=5)
  1 => 
    array (size=3)
      0 => string 'Book B' (length=6)
      1 => int 1
      2 => string 'Smith' (length=5)
  2 => 
    array (size=3)
      0 => string 'Book C' (length=6)
      1 => int 4
      2 => string 'Abner' (length=5)

Затем вы можете довольно легко перебирать его, например:

foreach ($rows as $row) {
    list($title, $number, $line) = $row;
    printf('<tr><td>%s</td><td>%s</td><td>%s</td></tr>',
        $title, $number, $line);
}

Это должно дать вам что-то вроде:

<tr><td>Book A</td><td>2</td><td>Maria</td></tr>
<tr><td>Book B</td><td>1</td><td>Smith</td></tr>
<tr><td>Book C</td><td>4</td><td>Abner</td></tr>

Полезный побочный эффект этого подхода состоит в том, что ваши массивы не обязательно должны быть одинаковой длины; null будет использоваться там, где это возможно, для дополнения любых "отсутствующих" значений.

Еще один быстрый пример:

<?php

$letters = range('a', 'd'); // ['a', 'b', 'c', 'd']
$numbers = range(1, 3);     // [1, 2, 3]
$merged  = array_map(null, $letters, $numbers);

var_dump($merged);

Урожайность:

array (size=4)
  0 => 
    array (size=2)
      0 => string 'a' (length=1)
      1 => int 1
  1 => 
    array (size=2)
      0 => string 'b' (length=1)
      1 => int 2
  2 => 
    array (size=2)
      0 => string 'c' (length=1)
      1 => int 3
  3 => 
    array (size=2)
      0 => string 'd' (length=1)
      1 => null

Надеюсь это поможет :)

1
Darragh Enright 20 Апр 2016 в 08:33

Вы можете попробовать изменить свой код следующим образом:

foreach($lines as $z => $value)
{
   print '<tr>';
   print '<td>'.$title[$z].'</td>';
   print '<td>P'.$number[$z].'</td>';
   print '<td>['.$value.']</td>';
   print '<td></td>';
   print '</tr>';
}
0
Imran 20 Апр 2016 в 04:16

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

Например: $ title =

Array [0] = Книга А

Array [5] = Книга Б

Array [9] = Книга C

Так что, вероятно, это причина, по которой он не отображается соответствующим образом. Я не могу использовать функцию "для". Однако я не могу перенумеровать индекс, потому что это ключ для меня, чтобы продолжить работу со следующим модулем / функцией.

Итак, я попробовал следующий код ... но, похоже, чего-то не хватает ...

$i=0;
if (!empty($title)){
foreach($title as $key => $value){
   $y = $number[$key];
   if ($i<count($lines))
   {   $z = $lines[$i];
       $i+1;
   }

   print '<tr>';
   print '<td>'.$value.'</td>';
   print '<td>'.$y.'</td>';
   print '<td>['.$z.']</td>';
   print '<td></td>';
   print '</tr>';

   }
}

Ниже приводится результат, который я получаю. Теперь массив для $ строк, который не отображался должным образом.

------------------------------------------------
| Title     |    No    | Lines       | Remarks |
------------------------------------------------
| Book A    |    2     | Maria       |         |
| Book B    |    1     | Maria       |         |
| Book C    |    4     | Maria       |         |
------------------------------------------------
0
Julie 20 Апр 2016 в 07:37