in_array дает предупреждение - PullRequest
0 голосов
/ 29 ноября 2011

Все, у меня есть следующий код:

$qry = "Select * from vendor_options order by vendor_option_name ASC";
$result = mysql_query($qry);
while($resultset = mysql_fetch_array($result)){
    if(isset($_SESSION['pav_choosen_vendor_categories'])){
        for($z=0;$z<$_SESSION['pav_choosen_vendor_categories'];$z++){
            $sVendorId = $_SESSION['pav_vendor_categories_' . $z];
                if($sVendorId==$resultset['vendor_option_id']){
                    $vendor_cats_choosen[] = $sVendorId;
                }
        }
        if(in_array($resultset['vendor_option_id'],$vendor_cats_choosen)){
        ?>
        <input type="checkbox" value="<?php echo $resultset['vendor_option_id']; ?>" class="select_vendor" name="vendor_categories[]" checked><?php echo $resultset['vendor_option_name']; ?><br>
            <?php
        }else{
        ?>
        <input type="checkbox" value="<?php echo $resultset['vendor_option_id']; ?>" class="select_vendor" name="vendor_categories[]"><?php echo $resultset['vendor_option_name']; ?><br>
        <?php
        }
    }
}

Я пытаюсь проверить, находится ли значение, возвращенное в mysql_fetch_array, уже в моем массиве.Скажем, первое найденное в массиве значение находится в четвертой итерации цикла while.Я получу следующую ошибку:

Warning: in_array() expects parameter 2 to be array, null

Как только он доберется до значения, которое находится в массиве, остальные работают нормально.Почему это дает ошибку для первой пары?Спасибо.

Ответы [ 4 ]

2 голосов
/ 29 ноября 2011

Похоже, вы не инициализировали $vendor_cats_chosen как массив, и поэтому, если условие if($sVendorId==$resultset['vendor_option_id']) не является истинным, к нему не будут добавлены никакие элементы, неявно превращающие его в массив.

Инициализируйте его перед циклом while.Вы должны почти всегда инициализировать массивы перед использованием.

// Initialize the array
$vendor_cats_chosen = array();
while($resultset = mysql_fetch_array($result)){
  ....

Теперь, когда ваш оператор in_array() выполняется, массив может быть пустым, но будет действительным массивом.

// $vendor_cats_chosen might be an empty array, or may have elements.
if(in_array($resultset['vendor_option_id'],$vendor_cats_choosen)){
1 голос
/ 22 июля 2012

Чтобы исключить предупреждающее сообщение, можно использовать два подхода:

1) использование @ перед оператором, генерирующим предупреждающее сообщение (однако это не рекомендуемый инженерный подход)

2) перед использованием объекта array его можно отфильтровать в if-else. Например, в вашем случае вы можете добавить эту строку

if( $vendor_cats_choosen ){

  if(in_array($resultset['vendor_option_id'],$vendor_cats_choosen)){
    ?>
    <input type="checkbox" value="<?php echo $resultset['vendor_option_id']; ?>" class="select_vendor" name="vendor_categories[]" checked><?php echo $resultset['vendor_option_name']; ?><br>
        <?php
    }else{
    ?>
    <input type="checkbox" value="<?php echo $resultset['vendor_option_id']; ?>" class="select_vendor" name="vendor_categories[]"><?php echo $resultset['vendor_option_name']; ?><br>
    <?php
    }

} ?>
1 голос
/ 29 ноября 2011

Вы когда-либо заполняете массив $vendor_cats_choosen только в операторе if, что означает, что он потенциально может не содержать значений.Вы также не объявляете это до того, как запустите цикл, который его заполняет, - что вы должны сделать в любом случае, потому что добавление значения в необъявленный массив выдаст E_NOTICE.

Добавление строки

$vendor_cats_choosen = array();

... вверху скрипта и ошибка исчезнет.Если вы считаете, что этот массив должен содержать значения, вам может потребоваться проверить логику в вашем операторе if.

1 голос
/ 29 ноября 2011

Проблема в том, что ваш массив не всегда создается. Чтобы исправить эту проблему, просто добавьте

$vendor_cats_choosen = array();

где-то до while в вашем коде.

...