Как передать ifstament в subarray внутри цикла foreach

Я хочу пройти if,else состояние с html данные. Цель состоит в том, чтобы проверить if session равно "мастер", а затем "разрешить доступ" else "доступ заблокирован".

Для этого я использую subarray внутри foreach,

Код ниже.

foreach ($list as $po_invoice) {
      $no++;
      $row = array();
      $row[] = $no;
      $row[] = $po_invoice->po_code;
      $row[] = $po_invoice->invoice_code;

      $row[]='if else here';

      $row[]='<ul class="dropdown-menu">
               <li><input type="button" class="w3-button w3-block w3-teal edit" value="Edit" id="'.$po_invoice->id.'"></li>
               <li><input type="button" class="w3-button w3-block w3-red  delete" value="Delete" id="'.$po_invoice->id.'"></li>
             </ul>



      $data[] = $row;
    }

я хочу использовать if-else Вот

$row[]= 'if ($id->type=='super_user' OR $id->type=='user') 
    {
    echo "<span class='w3-text-red fa fa-warning '>  Access Forbidden</span>";
    } else {
    '*Some Html Here***'
    };

Я использовал, но не работает в этом сценарии. Поэтому, пожалуйста, скажите мне, как это работает в этом сценарии. Заранее спасибо, кто решит мою проблему.

2 ответа

Решение

Упрости

<?php 
$row = array();
foreach ($list as $po_invoice) {
      $no++;

      $row[] = $no;
      $row[] = $po_invoice->po_code;
      $row[] = $po_invoice->invoice_code;

     if ($id->type=='super_user' OR $id->type=='user') 
     {
        $row[] = "<span class='w3-text-red fa fa-warning '>  Access Forbidden</span>";
     }else{

        $row[]='<ul class="dropdown-menu">
               <li><input type="button" class="w3-button w3-block w3-teal edit" value="Edit" id="'.$po_invoice->id.'"></li>
               <li><input type="button" class="w3-button w3-block w3-red  delete" value="Delete" id="'.$po_invoice->id.'"></li>
             </ul>';
     }

      $data[] = $row;
}

А также $row = array(); переменная записывается вне области видимости, поэтому при каждом запуске цикла она получает старые значения

Вы можете использовать функцию обратного вызова вместо:

  $row[]='if else here';

  $row[]='<ul class="dropdown-menu">
           <li><input type="button" class="w3-button w3-block w3-teal edit" value="Edit" id="'.$po_invoice->id.'"></li>
           <li><input type="button" class="w3-button w3-block w3-red  delete" value="Delete" id="'.$po_invoice->id.'"></li>
         </ul>';

Вы могли бы сделать что-то вроде этого:

  $row[]=function($id) use ($po_invoice) {
    if ($id->type=='super_user' OR $id->type=='user'){ 
        echo '<ul class="dropdown-menu">
                  <li><input type="button" class="w3-button w3-block w3-teal edit" value="Edit" id="'.$po_invoice->id.'"></li>
                  <li><input type="button" class="w3-button w3-block w3-red  delete" value="Delete" id="'.$po_invoice->id.'"></li>
         </ul>';
     }else{
         echo '';
     }
 };

Затем в дальнейшем вы просто делаете это:

 $row($id);  //or $row[0]($id); or what have you

песочница

use Ключевое слово используется для передачи "лишних" данных в функцию, когда она объявлена, обычные аргументы передают данные, когда она выполняется.

В целом это был бы плохой способ реализовать это, я просто хотел показать это как вариант. Главным образом это будет плохо от обслуживания и читаемости / стандартизации типа кадра. Под этим я подразумеваю, что было бы хорошо, если бы все элементы в массиве имели одинаковые базовые входные данные, а все обратные вызовы. Проблема заключается в сопоставлении аргументов с элементами массива, которые вы не можете получить, какого типа элемент находится в массиве (функция, HTML и т. Д.), И у вас не будет возможности узнать аргументы заранее. Если вы должны были смешивать типы и аргументы среди различных обратных вызовов.

Надеюсь, что это имеет смысл.

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

PS не забудьте поставить $row = array(); вне цикла, как указано в другом ответе.

Обратите внимание, что есть также разница между OR а также ||в данном случае это не применимо, но слово "версия" имеет более низкий приоритет, чем булева версия, так что вы можете столкнуться с ситуацией, когда все выходит из порядка, которого вы ожидаете, если вы смешаете их.

Другие вопросы по тегам