如何在数组键中搜索子字符串?

4
我有一个如下的数组
$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);

非常抱歉,我在正则表达式方面不是很擅长。

有什么想法吗?任何建议?


2个回答

4

preg_grep函数适用于数组的值(value),而不是键(key),这正是您所需的。

首先,您可以获取键(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


谢谢回复。它有效了,但现在出现了一个问题,就是它给我提供的结果如下: array( [35] => 123,456,789 ); 但它没有给我只有123,456,789。 - Ankit Doshi
这是因为可能会有多个结果。如果您确定只会返回一个元素,则可以使用 current($matching_key) 来获取此元素的值。另外,您应该验证第一位是否有任何结果。 - Jakub Matczak
谢谢,我明白了。但是你能否再帮我一下,我想要改变元素的值,就像这样。如果456匹配并且它是第二个元素,那么我确定这个键值为1,1,1(第二个元素的值为1),并且想要将其更改为0,其他的保持不变,所以新数组如下: array(123,456,789)=>1,0,1 - Ankit Doshi
这就是为什么我说你应该改变你的数据结构。现在很难进行任何操作。虽然可以做到,但不会很容易。 - Jakub Matczak
我知道你的想法真的很好,而且我接受这个数据结构并不是很好,但实际上它是一个非常长的 Web 应用程序,已经开发完成了。现在要改变这个逻辑非常困难,因为它会产生非常大的影响,所以我该怎么做呢?你能指导我吗? - Ankit Doshi
使用 explode 函数对键和值进行分离,然后使用 array_combine 函数将它们组合起来,接着修改目标键的值,最后将修改后的值用 implode 函数连接起来,并放回原始数组中的原始键下。 - Jakub Matczak

0

这里是一个尝试

$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,尝试使用上面的示例,如果适用于您的情况,请将foreach替换为array_walk()函数。 - Reiah Paul Sam
这段代码还可以匹配"12,3456,789"。任何非正则表达式的解决方案,在逗号处理上会产生错误的结果。 - mickmackusa
1
@mickmackusa 我明白。问题不在于此。他们甚至会搜索键中的任何组合,如3,4456,7,这就是我选择使用strpos而不是foreach和正则表达式的原因。我不知道为什么他们会对我的答案投反对票。既然有内置方法,为什么要使用regexforeach呢? - Reiah Paul Sam
我认为你并没有理解。如果搜索关键字值在逗号分隔的字符串中任何位置,你的答案将会失败。这里有一个演示:http://sandbox.onlinephpfunctions.com/code/43f6465586ec2b81c8db8e807502bdc2c4d2c8f1 请删除你的答案,因为它不能为OP提供所需的结果。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接