Очень простой foreach и если - не могу понять, почему он не работает - PHP - PullRequest
2 голосов
/ 27 марта 2011

Я уже сделал миллион сценариев if и foreach в сценариях и раньше, но этот, похоже, не могу понять.Это просто не работает ...?Возможно, это одна из тех вещей, что если вы посмотрите на нее 100 раз, вы не увидите ошибку и вам понадобится второй набор глаз.Итак, вот код:

private function removeResultsByUID() {
   foreach ($this->searchResults as $key => $value) {
    if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)
        unset($this->searchResults[$key]);
        }
   return;
   }

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

private function removeResultsByUID() {
    foreach ($this->searchResults as $key => $value) {
        var_dump($this->searchResults[$key]['authorUID']);
                echo ' ';
                var_dump($this->searchUID);
                echo '<br />';
        if (!$this->searchResults[$key]['authorUID'] == $this->searchUID) {
             echo "This isn't a match";
             unset($this->searchResults[$key]);
                     }
        }
    die();
    return;
    }

Хорошо, так что простой способ проверить, вывести дамп переменныхесли посмотреть, что их значения установлены (используя var_dump вместо echo, чтобы убедиться, что они оба являются строковыми типами, насколько мне известно).Затем я добавляю эхо в if, чтобы увидеть, когда срабатывает условие if.Затем убейте скрипт для просмотра результатов.Я добавляю в некоторые критерии поиска имя пользователя, программа меняет его на userID, основываясь на таблице в БД, каждый результат, который он получает из поиска, который соответствует, добавляет идентификатор пользователя автора в массив результатов.Вот что я получаю:

string(1) "3" string(1) "3"
string(1) "1" string(1) "3"
string(1) "1" string(1) "3"
string(1) "1" string(1) "3"

Похоже, что if никогда не запускается, даже несмотря на то, что дамп-переменные, которые использует if, создают впечатление, что должны запускаться в течение последних 3 итераций.Я смотрел на это в течение часа.Что, черт возьми, я сделал не так?Я собираюсь надрать себя за глупую ошибку, я уверен, я просто не вижу ее.Спасибо за любую помощь!

Ответы [ 8 ]

1 голос
/ 28 марта 2011

Я предполагаю, что searchResults - это массив массивов

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

foreach ($this->searchResults as $key => $value)

Тогда вы вообще не используете значение:

if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)

Я думаю, вы хотели сказать:

if (value['authorUID'] != $this->searchUID)  // (fixed Boolean logic)

, и вы можете дополнительно оптимизировать его, используя ссылку в foreach:

 foreach ($this->searchResults as $key => &$value)
1 голос
/ 27 марта 2011

вы хотите использовать !=, а не !$x == $y:

if ($this->searchResults[$key]['authorUID'] != $this->searchUID) {
// or: if(!($this->searchResults[$key]['authorUID'] == $this->searchUID)) {
  // your code here
}

!$this->searchResults[$key]['authorUID'] будет true или false (скорее всего false, если у вас нет идентификатораиз "0").так что ваше сравнение превращается в false == $this->searchUID - вряд ли совпадет.

0 голосов
/ 27 марта 2011

Вы хотите использовать!и если «authorID» равен «searchUID», а «authorId» - это массив, вы хотите попробовать более простой, элегантный и быстрый способ перебрать ваш массив:

if ( ! $this->searchResults [$key] [ 'authorId' ] [ $this->searchUID ] ) {

Вот вся функция:

private function removeResultsByUID() {
 foreach ( $this->searchResults as $key => $value ) {
    if ( ! $this->searchResults[$key] [ 'authorId' ] [ $this->searchUID ] ) {
         unset($this->searchResults[$key]);
    }
  }
  return;
}
0 голосов
/ 27 марта 2011

Вот ваша проблема:

if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)

Это должно быть:

if ($this->searchResults[$key]['authorUID'] != $this->searchUID)

Я не уверен на 100% (не проверял), но если вы!целое число, оно возвращает == 0. IE: целое число "true", если оно не равно нулю.Таким образом, у вас есть «! True == целое число» или «false == целое число», и поскольку ваше другое целое число не равно нулю, в качестве теста у вас будет «false == true».

0 голосов
/ 27 марта 2011

В вашем операторе if есть простая логическая ошибка.Вот что у вас есть:

if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)

Глядя на это, вы отрицаете $ this-> searchResults [$ key] ['authorUID'] перед сравнением.

Отрицание строки, поворотэто ложно.Так что вы всегда проверяете:

if(false == $this->searchUID)

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

Редактировать:

Пока я смотрел, я понял, что дамп переменной - это 'string (1) "3".Если это идентификатор, разве не имеет смысла (и будет быстрее) использовать простое int, а не сравнение строк?

0 голосов
/ 27 марта 2011

Может ли это быть размещение!в вашем заявлении if?

Не будет ли ваше утверждение if равняться:

if ([opposite-of]$this->searchResults[$key]['authorUID'] (false) == $this->searchUID (true)
0 голосов
/ 27 марта 2011

У вас есть! $ This-> searchResults [$ key] ['authorUID'] Если вы хотите, чтобы они были равны, удалите!

Если вы хотите, чтобы они не были равны, то должно быть, если$ this-> searchResults [$ key] ['authorUID']! = $ this-> searchUID)

0 голосов
/ 27 марта 2011
if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)

Вы отрицаете первый член, а затем сравниваете его со вторым.Добавьте скобки или используйте !=.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...