Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-通过两个或多个参数之一高效搜索数组_Php_Arrays - Fatal编程技术网

PHP-通过两个或多个参数之一高效搜索数组

PHP-通过两个或多个参数之一高效搜索数组,php,arrays,Php,Arrays,我有一个简单的数组: $arr = [ 'id1' => 'lotsOfData1', 'id2' => 'lotsOfData2', 'id3' => 'lotsOfData3', ]; 搜索此数组非常简单,只需$arr[$myId] 如果我想通过id以外的方式查找lotsOfData,该怎么办?也许我有这样一个例子:id-name-email-lotsOfData。我假设id、name和email的每个值都是唯一的。我有几个想法: 正则表达式或爆炸

我有一个简单的数组:

$arr = [
    'id1' => 'lotsOfData1',
    'id2' => 'lotsOfData2',
    'id3' => 'lotsOfData3',
];
搜索此数组非常简单,只需
$arr[$myId]

如果我想通过id以外的方式查找lotsOfData,该怎么办?也许我有这样一个例子:
id-name-email-lotsOfData
。我假设id、name和email的每个值都是唯一的。我有几个想法:

正则表达式或爆炸:

$arr = [
    'id1&name lastname&email1' => 'lotsOfData1',
    'id2&nameonly&email2' => 'lotsOfData2',
    'id3&&email3' => 'lotsOfData3', // guy 3 is nameless
];
问题-找到一个永远不会出现在任何搜索值中的要分解的字符,如果使用正则表达式,则正则表达式的速度很慢。以后按数组位置查找完整键值有点笨拙

数组_列:

$arr = [
    0 => ['id' => 'id1', 'name' => 'name lastname', 'email1' => 'email', 'data' => 'lotsOfData'],
    0 => ['id' => 'id2', 'name' => 'namey', 'email' => 'email2', 'data' => 'lotsOfData'],
    //etc
];
以及:


我更喜欢这个解决方案,但我不太喜欢阵列结构


还有其他解决方案吗?

您可以使用多个关联数组,其中包含具有不同键的行:

$arr_by_id = [];
$arr_by_name = [];
$arr_by_email = [];
foreach ($arr as $row) {
    $arr_by_id[$row['id']] = $row;
    $arr_by_name[$row['name'] = $row;
    $arr_by_email[$row['email']] = $row;
}
现在,如果您想通过电子邮件查找某人,请执行以下操作:

$x = $arr_by_email['data'];

如果希望能够修改任何关联数组中的行数据,可以使用引用。

对于此数组,我不会进行分解

$arr = [
    'id1&name lastname&email1' => 'lotsOfData1',
    'id2&nameonly&email2' => 'lotsOfData2',
    'id3&&email3' => 'lotsOfData3', // guy 3 is nameless
];
反而

 $res = array_intersect_key($arr, array_flip(preg_grep('/^id3/', array_keys($arr))));

 print_r($res);
输出

Array
(
    [id3&&email3] => lotsOfData3
)
试试看

这很疯狂,但很管用。并且,它只使用4个函数调用..:-p


实际上,我在事件系统中使用了类似的方法,可以使用正则表达式来监听事件,效果很好。

因此,您正在研究
$arr
的第二个示例,并搜索id是什么?“我更喜欢这个解决方案,但我不太喜欢数组结构。”这是一种比您在上面提出的正则表达式结构更简洁的结构。
$arr[array\u search(array\u column($arr,'id'))]['data']
Woops,您已经有了它。这就是我要做的。基于搜索的数组结构没有
风扇。这就是你访问数组的方式。我不会爆炸,你可以用
preg\u grep($regx,array\u keys($arr))
也许,参考谢谢,阅读你的回复总是很有趣的。那么你会在数组列上使用正则表达式吗?我会使用你现有的数组结构。他们是不同的。但是忽略该数组列会更快。但它也没有像Regx那样的模糊搜索。所以这要视情况而定。你已经有了另一个,所以我只加了这个。没有偏好,以适合需要的为准。我提到的例子我需要模糊搜索。我没有想到这一点,使用引用肯定可以让它变得简单。这有什么大的缺点吗?我想删除或重新排列成员可能会比平常更乏味,但没有什么是不可能的。是的,如果您向
$arr
添加新行,您还需要更新所有键控数组。您可以为此创建一个函数。将其包装到类中也可能很有用。
Array
(
    [id3&&email3] => lotsOfData3
)