如何在数组键中搜索子字符串?
Posted
技术标签:
【中文标题】如何在数组键中搜索子字符串?【英文标题】:How to search for a substring in array keys? 【发布时间】:2017-10-29 14:33:42 【问题描述】:我有一个像下面这样的数组
$array =array(
"123,456,789"=> "1,1,1",
"333"=>"1",
"777"=>"1"
)
现在如果我搜索 456,则需要返回数组键 (123,456,789) 及其值 (1,1,1)
我也尝试了下面的方法以使其正常工作,但我没有成功。如果我使用数组键的任何值(如(123 或 456 或 789)进行搜索,则需要为我提供相同的结果。我知道我可以使用 foreach 循环来实现这一点,但我不想为此创建 foreach 循环,所以如果存在任何其他解决方案,请建议我。
$matching_key = preg_grep("/\b456\b/", $array);
对不起,我的正则表达式不太好。
想法?有什么建议吗?
【问题讨论】:
【参考方案1】:试试看
$array =array(
"123,456,789"=> "1,1,1",
"333"=>"1",
"777"=>"1"
);
$search = '456';
$result = [];
foreach($array as $key=>$value)
if (strpos($key, $search) !== false)
array_push($result, $value);
Print_r($result);
$search
是您要搜索的动态变量,我使用str_pos()
来查找该键中是否存在字符串。
【讨论】:
@Ankit Doshi 试试上面的例子,如果适用于你的场景,用 array_walk() 函数替换 foreach 这也将匹配“12,3456,789”。任何不会在逗号上爆炸的非正则表达式解决方案都会给出不正确的结果。 @mickmackusa 我明白了。问题不在于。他们甚至会搜索3,4
或456,7
,无论键中的什么组合,这就是我选择strpos
而不是foreach
和正则表达式的原因。我不知道他们为什么不赞成我的回答。,当有内置方法时,为什么要选择regex
或foreach
。
我认为你不明白。如果搜索键值位于逗号分隔字符串内的任何位置,您的答案将严重失败。这是一个演示:sandbox.onlinephpfunctions.com/code/… 请删除您的答案,因为它没有为 OP 提供所需的结果。【参考方案2】:
preg_grep
函数适用于数组的 values,而不是 keys,因为它是您需要的。
你可以先拿到钥匙。
<?php
$array =array(
"123,456,789"=> "1,1,1",
"333"=>"1",
"777"=>"1"
);
$keys = array_keys($array);
$matching_key = preg_grep("/\b456\b/", $keys);
var_dump($matching_key);
//returns "123,456,789"
https://3v4l.org/SndkV
无论如何,我需要说你可能应该改变你的数据结构。这看起来是个糟糕的设计。
【讨论】:
感谢您的回复。它可以工作,但现在问题来了,就像它为我提供的结果如下数组([35] => 123,456,789);但它不只给我 123,456,789 那是因为可能有多个结果。如果你确定只会返回一个元素,你可以使用current($matching_key)
来获取这个元素的值。此外,您应该首先验证是否有任何结果。
谢谢我明白了。但是你能不能帮一些忙,我希望元素值需要像这样更改。456 匹配并且它的第二个元素然后我确定这个键值 1, 1,1(第二个元素的值为 1)并希望将其更改为 0 和其余相同的新数组,如 array(123,456,789)=>1,0,1
这就是为什么我说你应该改变你的数据结构。现在很难做任何手术。这是可能的,但并不容易。
我知道你的想法非常好,我接受数据结构不是很好,但实际上它是一个很长的网络应用程序,现在已经开发出来了,我很难改变这个逻辑,因为它会影响很大,我该怎么做?你会指导我吗?以上是关于如何在数组键中搜索子字符串?的主要内容,如果未能解决你的问题,请参考以下文章