PHP - 根据另一个参数的值获取多维数组值

时间:2017-08-30 10:00:47

标签: php arrays multidimensional-array

想象一下,我有这个数组:

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中有可能吗?

7 个答案:

答案 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第二个参数定义结果数组的键。此方法减少了数组中搜索数据的工作量。

Try this code snippet here

$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()(或经典循环)准备数据的答案已经失去了作为一种有效技术的资格。

性能最好的技术是迭代数组,目的是使用早期的 breakarray_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