Оператор «===» неправильно вычисляется при использовании в объекте, как это должно быть php

#php #class #if-statement #foreach

#php #класс #if-оператор #foreach

Вопрос:

Я пытаюсь перебрать массив, назначенный объекту. Функция entity_products_check() должна сравнивать отправленный продукт с массивом предварительно сохраненных значений из базы данных. Цикл foreach должен вычисляться как true в предоставленном тестовом примере. Однако по причинам, которые я не могу понять, оператор === возвращает empty (т. Е. null), и XAMPP оценивает его как false . По какой-то странной причине это происходит только в том случае, если проверяется первое значение. Для любого другого результата он выполняется правильно. Я не понимаю, почему это происходит?

  $entity=array("products"=>array("machine", "lollipop"));
 class Borrowing_Cost
 {
    public array $entity;
    public array $item;
    public array $borrowing;
    public function __construct($entity, $item, $borrowing)
    {

        $this->entity = $entity;
        $this->item = $item;
        $this->borrowing = $borrowing;
    }

    public function entity_products_check($arg){
        $is_item = "";                

        **foreach ($this->entity["products"] as $value){           
            if($value === $arg){
                $is_item = "true";
            } else {
                $is_item = "false";
            }
        }**

        return $is_item;
    }
 }
 $borr = new Borrowing_Cost($entity, $item, $borrowing);
 echo $borr->entity_products_check("machine") . "<br>";
 

Комментарии:

1. === никогда не возвращает empty (что является пустым в сравнениях?) или NULL . Он возвращается true или false , и ничего больше. Второе — это ваш цикл, в $is_item котором будет только последнее значение. Например, в foreach будет 10 элементов, 3-й будет true , но функция возвращает false (потому что последний имеет значение false).

2. Вы должны включить отчеты об ошибках, ваш код генерирует несколько.

Ответ №1:

В вашем коде вы сравниваете каждый элемент со значением, которое вы ищете, поэтому после того, как он его найдет, он все равно перейдет к следующему элементу и установит флаг false . .

Этот код устанавливает значение false в начале и только когда-либо помечает его true , когда он найден, а затем останавливается… общедоступная функция entity_products_check($arg){ $is_item = «false»;

     foreach ($this->entity["products"] as $value){
        if($value === $arg){
            $is_item = "true";
            break;
        }
    }

    return $is_item;
}
 

Или вы могли бы использовать in_array() , чтобы проверить, находится ли значение в массиве для вас…

 public function entity_products_check($arg){
    return in_array($arg, $this->entity["products"])
        ? "true" : "false";
}
 

Комментарии:

1. Спасибо. Это смотрело мне в лицо. Спасибо.

2. @VTom, если это решило вашу проблему, пожалуйста, подумайте о том, чтобы отметить, что это соответствует ответу — meta.stackexchange.com/questions/5234 /…