【问题标题】:PHP - Delete all elements from array with a specific filterPHP - 使用特定过滤器从数组中删除所有元素
【发布时间】:2013-09-09 00:23:56
【问题描述】:

我正在构建一个支持 AJAX 的智能搜索引擎。

我使用关键字,所以在后端脚本中我分解了 AJAX 提供的字符串。

(字符串是搜索输入字段的值)

$keywords = $_POST["keywords"];
$keywords = strtolower($keywords);
$keyword = explode(" ", $keywords);

如您现在所见,我有一个名为 $keyword 的数组,其中包含所有关键字。

现在,我必须从数组中删除会导致不相关结果的值。更明确地说:我想删除所有长度小于 3 的行。

我尝试了很多方法,最后一个是一个简单的foreach循环:

foreach ($keyword as $key => $value) {
if ( strlen($key[ $value ]) < 3 ) {
    unset($keyword[$key]);
   }
}

我阅读了有关 array_filter 和类似函数的信息,但是 - 我的意思是 - 我无法想象为什么它不能以这种方式工作。

如果您有任何想法,请给我写一个答案! 感谢您的关注

【问题讨论】:

    标签: php ajax arrays filtering unset


    【解决方案1】:

    你的循环已经快到了,但是$value 不是$key 变量中的键。如果你print_r 你的$keywords 你会看到$key 变量将是=&gt; 左侧的字符串和右侧的$value

    快速修复:

    if( strlen($value) < 3 )
    

    更好的解决方法:

    $keywords = array_filter($keywords, function($x) { return strlen($x) >= 3; });
    

    嵌套修复

    $keywords = array_filter(explode(' ',strtolower($_POST)), function($x) { return strlen($x) >= 3; });
    

    替代修复(如果您的 PHP 版本太旧而无法执行上述匿名函数)

    $keywords = array_filter(explode(' ',strtolower($_POST)), create_function('$x', 'return strlen($x) >= 3;'));
    

    【讨论】:

      【解决方案2】:

      数组的值将在$value 而不是$key[$value]

      试试

      if ( strlen( $value ) < 3 ) {
      

      【讨论】:

        【解决方案3】:

        您可以为此使用array_filter

        $keywords = array_filter($keywords, function($keyword) {
            return strlen($keyword) >= 3;
        });
        

        它将返回一个所有关键字大于 2 个字符的数组。没有测试过,但我想你明白了。

        当然,普通的 foreach 也可以,但 array_filter 的代码更少,因此更易于维护和阅读。就速度而言,我想不会有太大的差异。

        【讨论】:

          猜你喜欢
          • 2016-02-12
          • 1970-01-01
          • 2011-01-27
          • 1970-01-01
          • 1970-01-01
          • 2021-11-01
          相关资源
          最近更新 更多