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

时间:2018-03-30 22:06:50

标签: php arrays

我有一个简单的数组:

$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
];

问题 - 找到一个不会出现在任何搜索值中的char会爆炸,如果使用正则表达式,则regex很慢。有点笨拙,以后可以通过数组位置找到完整的键值。

array_column:

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

return $arr[array_search($myId, array_column($arr, 'id'))]['data']; //by id

return $arr[array_search($myEmail, array_column($arr, 'email'))]['data']; //by email

我更喜欢这种解决方案,但我并不是阵列结构的忠实粉丝。

还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

对于这个阵列,我不会爆炸。

$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
)

试试online

它非常狂野,但它确实有效。而且,它只使用4个函数调用..: - p

我实际上在事件系统中使用这样的东西,可以使用正则表达式监听事件,它运行良好。

答案 1 :(得分:1)

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

$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'];

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