Добавить пустую строку, если ключ не существует в таблице списка - PullRequest
2 голосов
/ 20 марта 2020

Уважаемые люди, которые уже помогли раньше.

У меня есть таблица, которая объединяет пользовательские столбцы и пользовательские данные. Но, как вы видите, некоторые данные не находятся под правым столбцом.

enter image description here

Код моей таблицы:

                        <div class="card-body">
                        <table class="table table-hover demo-table-dynamic table-responsive-block" id="tableWithDynamicRows">
                            <thead>
                                <tr>
                                    <?php foreach ($fieldList as $field) {
                                        echo '<th>'.$field['name'].'</th>';
                                    } ?>
                                    <th>Actie</th>
                                </tr>
                            </thead>
                            <tbody>
                                    <?php 
                                        foreach ($dataList as $datas) {
                                            $values = getDataTableWithoutDatabase($datas, $list, 'datalist');
                                            foreach ($values as $value) {
                                                echo $value;
                                            }
                                        }  
                                    ?>
                            </tbody>
                        </table>
                    </div>

Мой метод, который создает таблицу:

function getDataTableWithoutDatabase(array $columns, array $list, string $table) {

$i = 0;
$len = count($columns);
foreach ($columns as $key => $value) {
    $field = '';
    if($key == array_key_first($list)) {
        $field .= '<tr>';
    }
    foreach ($list as $keys) {
        if($key != array_key_first($list) && empty($columns[$keys]) && $key != 'uid') {
            $field .= '<td class="v-align-middle"></td>';
        }
    }
    if($key != 'uid') {
        $field .= '<td class="v-align-middle">';
        $field .= '<p>' . $value . '</p>';
        $field .= '</td>';  
    }
    if($key == 'uid') {
        $last = '<td><a href="../'.$table.'edit?'.$table.'='. $value .'">Bewerken</a></td>';
    }
    if($i == $len - 1) {
        $field .= $last;
        $field .= '</tr>';
    }
    $fields[] = $field;
    $i++;
}
return $fields; 
}

Решение есть. Я хочу иметь правильную информацию под правильными столбцами: Ниже образец, который находится в переменной $columns

enter image description here

$list содержит:

['Voornaam','Achternaam','Initialen']

$columns содержат:

array(4) {
  ["Voornaam"]=>
  string(0) ""
  ["uid"]=>
  string(15) "7d1f4f8e906245f"
  ["Achternaam"]=>
  string(3) "Les"
  ["Initialen"]=>
  string(0) ""
}
array(4) {
  ["Voornaam"]=>
  string(6) "Simone"
  ["uid"]=>
  string(15) "7d1f4f8e906245g"
  ["Achternaam"]=>
  string(0) ""
  ["Initialen"]=>
  string(0) ""
}
array(4) {
  ["Voornaam"]=>
  string(0) ""
  ["uid"]=>
  string(15) "7d1f4f8e906245l"
  ["Achternaam"]=>
  string(4) "Yül"
  ["Initialen"]=>
  string(0) ""
}
array(4) {
  ["Voornaam"]=>
  string(0) ""
  ["uid"]=>
  string(15) "7d1f4f8e906245s"
  ["Achternaam"]=>
  string(3) "Mas"
  ["Initialen"]=>
  string(0) ""
}
array(4) {
  ["Voornaam"]=>
  string(0) ""
  ["uid"]=>
  string(15) "gGcYEJdRYJ1vqcn"
  ["Achternaam"]=>
  string(5) "Hello"
  ["Initialen"]=>
  string(0) ""
}

Ответы [ 4 ]

1 голос
/ 25 марта 2020

Я не вижу смысла совершать так много повторных вызовов array_key_first() - на самом деле, просто используйте известные имена столбцов, чтобы определять порядок данных при генерации разметки. Последняя ячейка в каждой строке таблицы - uid, поэтому просто добавьте ее в список имен столбцов.

Я переименовал многие из ваших переменных, чтобы вам было легче следовать вашему сценарию.

Я не знаю, насколько динамически c эта пользовательская функция станет. Я использую http_build_query() в качестве передового опыта - чтобы вы всегда генерировали правильную строку запроса, но если будут только alphanumeri c ключи и значения, то это может быть возвращено к вашей первоначальной технике непосредственного внедрения в строку URL.

Нет необходимости генерировать массив для возврата к таблице html, когда вы все равно собираетесь ее взорвать. Другими словами, просто создайте строку, верните ее и отобразите ее.

Полная перезапись: ( Демо )

function getDataTableWithoutDatabase(array $dataRow, array $columnNames, string $tableName) {
    $tableRow = '<tr>';
        foreach ($columnNames as $columnName) {
            $tableRow .= '<td class="v-align-middle">';
                if ($dataRow[$columnName]) {
                    $tableRow .= "<p>{$dataRow[$columnName]}</p>";
                }
            $tableRow .= '</td>';
        }
        $tableRow .= '<td><a href="../' . $tableName . 'edit?' . http_build_query([$tableName => $dataRow['uid']]) .'">Bewerken</a></td>';
    $tableRow .= '</tr>';
    return $tableRow;
}

$resultSet = [
    ['Voornaam' => '', 'uid' => '7d1f4f8e906245f', 'Achternaam' => 'Les', 'Initialen' => ''],
    ['Voornaam' => 'Foo', 'uid' => 'fedcba098765432', 'Achternaam' => '', 'Initialen' => ''],
    ['Voornaam' => '', 'uid' => '1234567890abcde', 'Achternaam' => '', 'Initialen' => 'Bar'],
];

$fieldList = [['name' => 'Voornaam'], ['name' => 'Achternaam'], ['name' => 'Initialen']];
$list = array_column($fieldList, 'name');
?>

<div class="card-body">
    <table class="table table-hover demo-table-dynamic table-responsive-block" id="tableWithDynamicRows">
        <thead>
        <tr>
            <?php echo '<th>' . implode('</th><th>', $list) . '</th>'; ?>
            <th>Actie</th>
        </tr>
        </thead>
        <tbody>
        <?php
        foreach ($resultSet as $row) {
            echo getDataTableWithoutDatabase($row, $list, 'datalist');
        }
        ?>
        </tbody>
    </table>
</div>

Вывод (после повторной привязки разметки) :

<div class="card-body">
    <table class="table table-hover demo-table-dynamic table-responsive-block" id="tableWithDynamicRows">
        <thead>
            <tr>
                <th>Voornaam</th>
                <th>Achternaam</th>
                <th>Initialen</th>
                <th>Actie</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="v-align-middle"></td>
                <td class="v-align-middle"><p>Les</p></td>
                <td class="v-align-middle"></td>
                <td><a href="../datalistedit?datalist=7d1f4f8e906245f">Bewerken</a></td>
            </tr>
            <tr>
                <td class="v-align-middle"><p>Foo</p></td>
                <td class="v-align-middle"></td>
                <td class="v-align-middle"></td>
                <td><a href="../datalistedit?datalist=fedcba098765432">Bewerken</a></td>
            </tr>
            <tr>
                <td class="v-align-middle"></td>
                <td class="v-align-middle"></td>
                <td class="v-align-middle"><p>Bar</p></td>
                <td><a href="../datalistedit?datalist=1234567890abcde">Bewerken</a></td>
            </tr>
        </tbody>
    </table>
</div>
1 голос
/ 20 марта 2020

Это потому, что если firstname отсутствует, вы не добавляете пустой td из-за:

$key != array_key_first($list)

в

    foreach ($list as $keys) {
        if($key != array_key_first($list) && empty($columns[$keys])) {
            $field .= '<td class="v-align-middle"></td>';
        }
    }

Это предотвращает firstname столбец, который нужно нарисовать, если он отсутствует. Потому что он всегда будет пропускать это, если только key первого столбца фактически не присутствует в массиве column

Ваши коды печатают:

foo  | bar | 15
bar2 | 24  |
bar3 | 

Пропуск этой проверки должен сделать это работать, потому что он пустует td слева.

0 голосов
/ 25 марта 2020

Ниже приведена функция PHP, которую вы можете скопировать / вставить в свой код, чтобы заменить тело своей функции getDataTableWithoutDatabase:

function getDataTableWithoutDatabase(array $columns, array $list, string $tableName) {
    $response = '<tr>';

    foreach ($list as $i => $column) {
        $response .= '<td class="v-align-middle">';

        // I'm using "ucfirst" here since I see your "$columns" array has its keys
        // with their first letter in upper case. Change it if you need it.

        $columnName = ucfirst($column);

        if (isset($columns[$columnName])) {
            $response .= $columns[$columnName];
        }

        $response .= '</td>';
    }

    // Add the last column with the link.

    $response .= '<td><a href="../'.$tableName.'edit?'.urlencode($tableName).'='.urlencode($columns['uid']).'">Bewerken</a></td>';

    $response .= '</tr>';

    return $response;
}

Единственное поле, которое я не вижу в вашем вопрос, который присутствует на изображении, называется Act ie, но я предполагаю, что он будет присутствовать в $ list .

Здесь вы можете попробовать эту функцию онлайн : http://sandbox.onlinephpfunctions.com/code/0e50b76de77c0a763ea769bd13788572f92f3a14

0 голосов
/ 20 марта 2020

Поскольку вы знаете, что имена ключей / столбцов совпадают ...

public function getDataTableWithoutDatabase(array $columns, array $list) {
    $fields = [];
    foreach ($list as $row) {
        $field = '<tr>';
        foreach ($columns as $column) {
            $field .= '<td class="v-align-middle">';
            if(!empty($row[$column])) {
                $field .= '<p>' . $row[$column] . '</p>';
            }
            $field .= '</td>';
        }
        $field .= '</tr>';
        $fields[] = $field;
    }
    return $fields; 
}

Это должно вывести

| foo | bar  | 15 |
|     | bar2 | 24 |
|     | bar3 |    |
...