根据搜索值的部分匹配过滤多维数组

Posted

技术标签:

【中文标题】根据搜索值的部分匹配过滤多维数组【英文标题】: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'

【问题讨论】:

【参考方案1】:

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

$search_text = 'Bread';

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

更多信息:

array_filter strpos return values

【讨论】:

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

 

【讨论】:

以上是关于根据搜索值的部分匹配过滤多维数组的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:从包含对象的多维数组中返回不匹配的值

Python numpy 多维数组由另一个数组值过滤

在多维数组中找到两个相关数字的最接近组合

具有未知键数的多维数组上的PHP Array_intersect

php计算多维数组某个值的和

将一个数组值与另一个多维数组匹配,然后从多维数组中获取值