【问题标题】:Filter multidimensional array based on partial match of search value根据搜索值的部分匹配过滤多维数组
【发布时间】:2011-10-19 10:24:02
【问题描述】:

我正在寻找一个给定这个数组的函数:

array(
 [0] =>
  array(
   ['text'] =>'I like Apples'
   ['id'] =>'102923'
 )
 [1] =>
  array(
   ['text'] =>'I like Apples and Bread'
   ['id'] =>'283923'
 )
 [2] =>
  array(
  ['text'] =>'I like Apples, Bread, and Cheese'
  ['id'] =>'3384823'
 )
 [3] =>
  array(
  ['text'] =>'I like Green Eggs and Ham'
  ['id'] =>'4473873'
 ) 
etc.. 

我要找针

“面包”

得到如下结果

[1] =>
  array(
   ['text'] =>'I like Apples and Bread'
   ['id'] =>'283923'
 )
 [2] =>
  array(
  ['text'] =>'I like Apples, Bread, and Cheese'
  ['id'] =>'3384823'

【问题讨论】:

    标签: php multidimensional-array filtering partial-matches


    【解决方案1】:

    使用array_filter。您可以提供一个回调来决定哪些元素保留在数组中,哪些元素应该被删除。 (回调的返回值false 表示应该删除给定的元素。)像这样:

    $search_text = 'Bread';
    
    array_filter($array, function($el) use ($search_text) {
            return ( strpos($el['text'], $search_text) !== false );
        });
    

    更多信息:

    【讨论】:

    • 更好地使用strpos(…) !== FALSE。这样可以节省函数调用,而且速度更快。
    • 谢谢汉斯,出于好奇,“使用”运算符是什么?它就像每个循环中的“as”运算符吗?我找不到任何有关它的信息。
    • use 关键字使您提供的变量在函数的范围内可用。默认情况下,该函数内部$search_text 是未定义的,因此我们编写use 让PHP 将变量“转移”到本地范围内。
    • 为什么我总是收到这个错误? Parse error: syntax error, unexpected T_FUNCTION我什至尝试直接从link复制示例
    【解决方案2】:

    从 PHP8 开始,有一个新函数可以返回一个布尔值来表示字符串中是否出现子字符串(这是作为strpos() 的更简单替代提供的)。

    str_contains()

    这需要在迭代函数/构造中调用。

    从 PHP7.4 开始可以使用箭头函数来减少整体语法并将全局变量引入自定义函数的范围。

    代码:(Demo)

    $array = [
        ['text' => 'I like Apples', 'id' => '102923'],
        ['text' => 'I like Apples and Bread', 'id' =>'283923'],
        ['text' => 'I like Apples, Bread, and Cheese', 'id' => '3384823'],
        ['text' => 'I like Green Eggs and Ham', 'id' =>'4473873']
    ];
    
    $search = 'Bread';
    var_export(
        array_filter($array, fn($subarray) => str_contains($subarray['text'], $search))
    );
    

    输出:

    array (
      1 => 
      array (
        'text' => 'I like Apples and Bread',
        'id' => '283923',
      ),
      2 => 
      array (
        'text' => 'I like Apples, Bread, and Cheese',
        'id' => '3384823',
      ),
    )
    

    【讨论】:

      【解决方案3】:

      多数组是有原因的。 id 是唯一的,可以用作索引。

      $data=array(
      
        array(
         'text' =>'I like Apples',
         'id' =>'102923'
       )
      ,
        array(
         'text' =>'I like Apples and Bread',
         'id' =>'283923'
       )
      ,
        array(
        'text' =>'I like Apples, Bread, and Cheese',
        'id' =>'3384823'
       )
      ,
        array(
        'text' =>'I like Green Eggs and Ham',
        'id' =>'4473873'
       )
      
       );
      

      $findme='面包';

       foreach ($data as $k=>$v){
      
       if(stripos($v['text'], $findme) !== false){
       echo "id={$v[id]} text={$v[text]}<br />"; // do something $newdata=array($v[id]=>$v[text])
       }
      
       }
      

      【讨论】:

        猜你喜欢
        • 2014-06-21
        • 2023-03-19
        • 2016-01-02
        • 2016-07-05
        • 1970-01-01
        • 2013-11-27
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多