想象一下,我有这个数组:
Array
(
[0] => Array
(
[email] => a@a.com
[name] => a
)
[1] => Array
(
[email] => b@b.com
[name] => b
)
)
我使用此代码检查我的电子邮件是否存在于此多数组中:
in_array($user->user_email, array_column($array, 'email'))
现在,我的问题是:如何获取参数'name'的值,其中电子邮件与我的变量匹配。 因此,如果我的$ user-> user_email等于'a@a.com',我需要名称值,即'a'。 在PHP中有可能吗?
答案 0 :(得分:2)
试试这个:
$index = array_search($user->user_email, array_column($array, 'email'));
if ($index !== false) $name = $array[$index]['name'];
这依赖于这样一个事实,即由array_column
创建的运行时数组保留了我们提取项目的顺序。因此,从该数组读取的索引可用于引用原始数组。
答案 1 :(得分:2)
而不是获取列,然后为email
搜索该数组。你可以这样做。 array_column
第二个参数定义结果数组的键。此方法减少了数组中搜索数据的工作量。
$user_email="a@a.com";
$result=array_column($array,"name","email");
if(isset($result[$user_email])){
echo "Name is: ".$result[$user_email];//Name is: a
}
如果你print_r($result)
你会得到。
Array
(
[a@a.com] => a
[b@b.com] => b
)
答案 2 :(得分:1)
这项任务在效率方面的目标是以最少的迭代次数执行数组搜索,并保证数组永远不会迭代超过一次(这是 n
).
此页面上的任何在开始搜索之前就使用 array_column()
(或经典循环)准备数据的答案已经失去了作为一种有效技术的资格。
性能最好的技术是迭代数组,目的是使用早期的 break
。 array_search()
在幕后使用了早期中断,但不幸的是它需要先调整数据结构。
使用任何函数式迭代器都无法承受提前中断的使用,因此它们也可以打折。
这是最适合经典循环的时候。使用条件中断时,代码段不会进行超过必要的迭代以找到匹配项。
代码:(Demo)
$array = [
['email' => 'a@a.com', 'name' => 'a'],
['email' => 'b@b.com', 'name' => 'b'],
];
$needle = 'a@a.com';
$name = null;
foreach ($array as $row) {
if ($row['email'] === $needle) {
$name = $row['name'];
break;
}
}
var_export($name);
输出:
'a'
答案 3 :(得分:0)
$name = "";
foreach($array as $key => $value)
{
if($value["email"] == $user->user_email)
{
$name = $array[$key]["name"];
}
}
答案 4 :(得分:0)
使用array_search
in_array
内容
$array = [
[
'email' => 'a@a.com',
'name' => 'a'
], [
'email' => 'b@b.com',
'name' => 'b'
]
];
$index = array_search('b@bc.com', array_column($array, 'email'));
// when there is no such value, $index will be equal 'false'
var_dump($index); // int(1)
答案 5 :(得分:0)
试试这个;
$name = $array[array_keys(array_column($array, 'email'), $user->user_email)[0]]['name'];
PD :(此代码仅获取搜索的第一个元素)
答案 6 :(得分:0)
你可以做一个单行,但它不是很好,很难读懂imo:
array_column($array, 'name')[($result = array_search('a@a.acom', array_column($array, 'email'))) ?: (is_int($result)? $result : -1)];
与上述相同,但为了可读性而格式化:
array_column($array, 'name')[
(
$result = array_search(
'a@a.acom',
array_column($array, 'email')
)
)
?:
(
is_int($result)? $result : -1
)
];
如果array_search
产生错误,则将名称数组传递给-1,以避免不存在的电子邮件,a@a.com
由于a
被评估为false
而返回0
{1}}。
这样,如果电子邮件不存在,您会收到Undefined offset
通知,这样电子邮件就会成为一系列名称的关键。
但是又来了。不是很好。而是考虑这样的函数:
function customArraySearch($array, $search_column, $search_value, $result_column) {
$result = array_search($search_value, array_column($array, $search_column));
if($result_key !== false) {
return array_column($array, $result_column)[$result_key]
}
return false;
}
customArraySearch($array, 'email', 'a@a.com', 'name'); //a
customArraySearch($array, 'email', 'uhoh@example.com', 'name'); //false