【问题标题】:Extremely simple foreach and if - can't figure out why it isn't working - PHP非常简单的 foreach 和 if - 无法弄清楚为什么它不起作用 - PHP
【发布时间】:2011-07-24 00:38:50
【问题描述】:

我之前已经在脚本中完成了一百万个 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 中添加一个 echo 以查看 if 条件何时触发。然后杀死脚本以查看结果。我用用户名输入了一些搜索条件,程序根据数据库中的表将其更改为用户 ID,它从匹配的搜索中获取的每个结果都将作者的用户 ID 添加到结果数组中。这是我得到的:

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 次迭代中触发。我盯着它看了一个小时。我到底做错了什么?我肯定会因为一个愚蠢的错误而自责,我只是看不到它。感谢您的帮助!

【问题讨论】:

  • 哦,至于为什么我在数据库调用后删除搜索结果而不是添加 WHERE UID = $this->searchUID - 是的,我知道这可能会加快它的速度,但是我有理由这样做。
  • 爱上半打眼睛发现你错过的东西。
  • 叹息,是的,它发生的频率比我想的要多;)

标签: php debugging foreach if-statement


【解决方案1】:

您想使用!= 而不是!$x == $y:

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

!$this-&gt;searchResults[$key]['authorUID'] 将是 true 或 false(很可能是 false,除非您的 id 为“0”)。所以你的比较变成了false == $this-&gt;searchUID——不太可能匹配。

【讨论】:

  • 它将始终为布尔值 false,因为 var_dump() 的输出为您提供“string(1)”1“”。虽然,我不完全确定他为什么将 ID 存储为字符串而不是整数。 添加评论
  • @jeremy:codepad.org/kicjmXfE,它也可以是布尔值 true ;) 我将编辑我的答案以反映布尔值,我在其中写了 0 和 1
  • 好吧,我绝对收回。在那里通过 PHP 进行漂亮的小检查。 :)
  • 是的,我想我对使用 !就像我一样,我以为我在说 if(条件不等于)。至于 $value['authorUID'] - 我认为 foreach 在数组的副本上工作,因此更改其中的值不会更改对象的版本 - 还是我也错了?我想我总是可以在值上使用参考。无论如何,感谢所有的答案,伙计们。
  • @这个解决方案给出了正确的答案,但它不是很好。看看我的解决方案!
【解决方案2】:

我假设 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)

【讨论】:

    【解决方案3】:
    if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)
    

    您是在否定第一项,然后与第二项进行比较。添加括号或使用!=。

    【讨论】:

      【解决方案4】:

      你有 !$this->searchResults[$key]['authorUID'] 如果您希望它们相等,请删除!

      如果你想让它们不相等,那么它应该是 if ($this->searchResults[$key]['authorUID'] != $this->searchUID)

      【讨论】:

        【解决方案5】:

        可能是 !在你的 if 语句中?

        你的 if 语句不等于:

        if ([opposite-of]$this->searchResults[$key]['authorUID'] (false) == $this->searchUID (true)
        

        【讨论】:

          【解决方案6】:

          这是你的问题:

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

          应该是:

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

          我不是 100% 确定(没有检查),但如果你!一个整数,它返回== 0。即:一个整数如果不为零,则为“真”。所以你有“!true == integer”,或者,“false == integer”,因为你的另一个整数是非零的,你有“false == true”作为你的测试。

          【讨论】:

            【解决方案7】:

            您的 if 语句中有一个简单的逻辑错误。这就是你所拥有的:

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

            看这个,你在比较之前否定 $this->searchResults[$key]['authorUID']。

            对字符串求反,将其变为假。所以你总是在检查:

            if(false == $this->searchUID)
            

            我不完全确定您要检查什么,但这应该会将您推向修复它的正确方向。

            编辑:

            当我查看时,我意识到 var 转储是 'string(1) "3"'。如果这是一个 ID,使用简单的 int 而不是字符串比较不是更有意义(并且更快)吗?

            【讨论】:

            • 它们在表中(MEDINT),我不确定它们是如何变成字符串的。
            【解决方案8】:

            你想用!如果 '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;
            }
            

            【讨论】:

            • 正如你所说,这更“优雅”,我想问几个问题。通过使用 $this->searchUID,您假设 [$key] 是一个数组,其键是 UID,但是,查看代码,似乎键已命名。他想将 [$key]['authorID'] 的值与 $this->searchUID 进行比较。你能解释一下这在原始(或任何更正的解决方案)的基础上如何更好/工作吗?
            • @epitaph:您的 if 条件不适用于 OP 建议的数组结构。它检查完全不同的东西
            • @all:别慌,我忘了一个数组,但我希望你明白意思!
            • 那你能扩展你的答案吗?我完全赞成学习更好的代码编写方法。
            • @Jeremy:我已经更正了我的答案。这就像使用哈希键。希望对你有帮助!
            猜你喜欢
            • 1970-01-01
            • 2012-07-09
            • 2021-05-29
            • 1970-01-01
            • 2014-12-08
            • 2012-05-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多