我有一个简单的数组:
$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
我更喜欢这种解决方案,但我并不是阵列结构的忠实粉丝。
还有其他解决方案吗?
答案 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'];
如果您希望能够修改任何关联数组中的行数据,则可以使用引用。