使用for语句检查数组值的最佳方法

时间:2010-02-04 15:20:42

标签: php arrays foreach

我想检查数组上是否有值,如下所示:

function check_value_new ($list, $message) {
    foreach ($list as $current) {
        if ($current == $message) return true;
    }
    return false;
}

function check_value_old ($list, $message) {
    for ($i = 0; $i < count ($status_list); $i ++) {
        if ($status_list[$i] == $$message) return true;
    }
    return false;
}

$arr = array ("hello", "good bye", "ciao", "buenas dias", "bon jour");
check_value_old ($arr, "buenas dias"); // works but it isn't the best
check_value_new ($arr, "buenas dias"); // argument error, where I'm wrong?

我已经阅读check_value_new方法是一种更好的数组处理方法,但我不习惯使用它,我应该如何修复它?

2 个答案:

答案 0 :(得分:3)

PHP提供了一个名为in_array的函数,用于检查给定数组中是否存在值。

您可以更改check_value_new功能以包含此内容:

function check_value_new ($list, $message) {
   foreach ($list as $current) {
     if (in_array($message, $current)) {
            return true;
  }
   return false;
}

如果您愿意,也可以在没有foreach循环的情况下使该功能正常工作,如此

function check_value_new ($list, $message) {
  // returns true if found, else returns false.
     return in_array($message, $list); 
 }

答案 1 :(得分:0)

您的 check_value_old() 函数中断的原因是因为您的循环的第二个参数中存在拼写错误。 $status_list 不是传递给函数的变量之一,并且在使用之前没有在任何地方声明。您只需要改用 $list 即可。也没有必要在每次迭代时都调用 count() —— 因为该值在循环中永远不会改变,只需在循环之前调用一次并在第二个参数中使用该值。

至于决定如何遍历数组值,没有理由重新发明原生函数调用。 in_array() 已经被设计和优化为在数组中搜索线性值并在找到匹配项后立即返回 true;否则返回 false

我不知道@AnthonyForloney 通过在 in_array() 循环内编写 foreach() 来做什么。代码片段不仅会因为没有足够的花括号而中断,而且输入数组没有两级数据,因此 in_array() 在收到字符串 $current 时会阻塞(不是预期的数组)。

最后,我的建议是:只有在没有满足您需求的本机函数时才编写您自己的自定义函数。扔掉手动循环的想法,只调用:

$arr = ["hello", "good bye", "ciao", "buenas dias", "bon jour"];
var_export(in_array("buenas dias", $arr));

我想提供的最后一个见解是关于微优化。如果您打算检查“非常大”数组中是否存在唯一值,或者如果您打算在同一个数组上进行数千次搜索,那么将数组设置为“翻转”方向并调用 isset()array_key_exists()isset()/array_key_exists() 将始终优于 in_array()array_search(),因为 php 将数组处理为“哈希映射”的方式。更多阅读here