非常简单的foreach和if-can';我不明白为什么它是';t-working-PHP

非常简单的foreach和if-can';我不明白为什么它是';t-working-PHP,php,debugging,foreach,if-statement,Php,Debugging,Foreach,If Statement,我以前在脚本中做过一百万个if和foreach,但这一个我似乎搞不清楚。它就是不起作用。。。?也许这是其中的一件事,如果你看它100次,你不会看到错误,需要第二双眼睛。好的,下面是代码: private function removeResultsByUID() { foreach ($this->searchResults as $key => $value) { if (!$this->searchResults[$key]['authorUID'] == $

我以前在脚本中做过一百万个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;
    }

看起来if从未触发过,即使if使用的转储变量使其看起来似乎应该在最后3次迭代中触发。我已经盯着它看了一个小时了。我到底做错了什么?我肯定会为一个愚蠢的错误而自责,我就是看不出来。谢谢你的帮助

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

if ($this->searchResults[$key]['authorUID'] != $this->searchUID) {
// or: if(!($this->searchResults[$key]['authorUID'] == $this->searchUID)) {
  // your code here
}
$此->搜索结果[$key]['authorUID']
将为
true
false
(很可能是
false
,除非您的id为“0”)。因此,您的比较变成
false=$this->searchUID
——不太可能匹配

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

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

你有$此->搜索结果[$key]['authorUID'] 如果您希望它们相等,请删除

如果你想让他们不平等,那就应该平等
如果($this->searchResults[$key]['authorUID']!=$this->searchUID)

可能是!在你的if声明中

您的if声明是否等同于:

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

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

if (!$this->searchResults[$key]['authorUID'] == $this->searchUID)
看看这个,在进行比较之前,您将否定$this->searchResults[$key]['authorUID']

对字符串求反,将其变为false。因此,您总是检查:

if(false == $this->searchUID)
我不完全确定您想检查什么,但这应该会将您推向正确的修复方向

编辑:

正如我所看到的,我意识到var转储是“string(1)“3”。如果这是一个ID,那么使用简单的int而不是字符串比较是否更有意义(更快)?

这是您的问题:

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

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

我不是100%确定(没有检查),但如果你!一个整数,它返回==0。IE:如果整数不是零,那么它就是“真”。所以您有“!true==integer”或“false==integer”,并且由于您的另一个整数是非零的,所以您有“false==true”作为您的测试。

您想使用!如果“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;
}

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

哦,至于我为什么在数据库调用后删除搜索结果而不是添加WHERE UID=$this->searchUID的评论-是的,我知道这可能会加快搜索速度,但我有理由这样做。我很喜欢有六只眼睛发现你错过的东西。唉,是的,这比我想的要频繁;)它将始终为布尔值false,因为var_dump()的输出将为您提供“string(1)”1“”。尽管如此,我不完全清楚为什么他将ID存储为字符串而不是int。加上comment@jeremy:,也可以是布尔值true;)我将编辑我的答案以反映布尔性,在这里我写了0和1,好吧,我肯定会收回。通过PHP进行漂亮的小检查。:)是的,我想我是误解了使用!虽然我是个符号,但我想我是在说如果(条件不相等)。至于$value['authorUID']——我以为foreach处理的是数组的副本,因此更改数组中的值不会更改对象的版本——或者我也错了?我想我可以用一个参考值。无论如何,感谢所有的答案,伙计们。@这个解决方案给出了正确的答案,但不是很好。看看我的解决方案!它们在桌子上,我不知道它们是怎么变成弦的。正如你所说的,这更“优雅”,我想问几个问题。通过使用$this->searchUID,您假设[$key]是一个数组,其中的键是UID的键,但是,查看代码,似乎键是命名的。他想将[$key]['authorID']的值与$this->searchUID进行比较。你能解释一下这是如何更好/基于原始(或任何更正的解决方案)工作的吗?@墓志铭:你的if条件与OP建议的数组结构不匹配。它完全检查了某些东西different@all:不要惊慌,我忘了一个数组,但我希望你能理解它的意思!那么,你能扩大你的答案吗?我完全赞成学习更好的编写代码的方法。@Jeremy:我已经更正了我的答案。这就像使用散列键一样。我希望有帮助!
 foreach ($this->searchResults as $key => &$value)