【问题标题】:PHP in_array() associative array issuePHP in_array() 关联数组问题
【发布时间】:2018-08-03 04:55:01
【问题描述】:

奇怪的 PHP in_array 问题让我感到困惑。不是 PHP 专家,但我有点筋疲力尽,似乎无法理解我可能出错的语法或属性。

这就是我想要做的:

  • 获取 CSV 文件,将其转为关联数组
  • 在数组中查找代码。这是我从简单的表单提交中获得的动态变量。
  • 如果代码存在则发送“消息”响应,否则发送“错误”响应

根据我的理解,下面的代码应该可以工作,但奇怪的是,当我添加“else”时,响应总是返回“错误”(例如,它永远不会进入 if,或者它每次都被重置迭代到错误)。

如果我删除 for 循环中的“else”条件,它会按预期工作,但我需要捕获错误。也试过严格比较,没有骰子!

感谢任何帮助!再次感谢您。

$csv = array_map('str_getcsv', file($file,FILE_SKIP_EMPTY_LINES));
$keys = array_shift($csv);

foreach ($csv as $i=>$row) {
    $csv[$i] = array_combine($keys, $row);
}
for ($j=0; $j<count($csv); $j++) {
    if (in_array($code, $csv[$j])) {
      $output = json_encode(array('type'=>'message', 'text' => 'Found'));
      die($output);
    } 
    else {
      $output = json_encode(array('type'=>'error', 'text' => 'Not Found'));
      die($output);
    }
}

【问题讨论】:

  • 您在 in_array() 中引用了 $code,但它是在哪里创建的?
  • $code 的值在哪里?
  • $code的值是多少?

标签: php arrays ajax


【解决方案1】:

由于ifelse 块中都有die(),因此您的代码将仅测试第一次迭代,然后停止执行。这就是当您省略 else 时它起作用的原因。

改成:

for ($j=0; $j<count($csv); $j++) {
    if (in_array($code, $csv[$j])) {
        $output = json_encode(array('type'=>'message', 'text' => 'Found'));
        die($output);
    } 
}

$output = json_encode(array('type'=>'error', 'text' => 'Not Found'));
die($output);

由于您在if 块中有一个die(),因此只有在if 块中的表达式永远不会计算为真时才会执行循环之后的任何代码。

【讨论】:

  • 哦 &*$%,就是这样。谢谢马格努斯。我知道这是基本的东西。对菜鸟时刻感到抱歉。
  • @Deep - 不用担心。我们都去过那里。 :-)(现在仍然是,不时)。
【解决方案2】:

您应该使用array_search 在关联数组中按值查找,而不是使用in_array,例如:

if (array_search($code, $csv[$j]))

【讨论】:

  • 感谢@Lovepreet 的回复。然而,那不是我的问题。条件得到满足,但正如 Magnus 指出的那样,这是迭代问题。但是,我很好奇 - 是否有特定的文档或速度测试证明在 in_array 上使用 array_search 是合理的?从我在这里读到的stackoverflow.com/questions/4518404/… - in_array() 似乎更快。再次感谢:)
  • @Deep - 这两个函数做不同的事情。 in_array() 只是检查一个值是否存在并返回一个布尔值,而array_search() 将返回相应的键,如果找到该值。在您的情况下,in_array() 更有意义。
  • 当使用array_search()时,你应该总是检查它:array_search($value, $array) !== false,因为如果找到值并且它有键0,它可以返回0。如果您按照上述操作,您可能会得到假阴性。
  • 嘿,是的!我知道那件事。我只是好奇如何/为什么建议在这里使用 array_search。正如你提到的,我只是在寻找“存在”检查并发送回复,所以选择了前者。 :)
【解决方案3】:

你没有在你的代码中定义 $code 变量,你也可以在代码中做是

if(!empty($code)&& in_array($code,$csv[$j])){

}

你需要检查 $code 变量是否为空!

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 2014-03-15
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    相关资源
    最近更新 更多