【问题标题】:search value in multi array在多数组中搜索值
【发布时间】:2022-01-12 20:05:22
【问题描述】:

我有两个数组(array_1 和 array_2)。 这是结构:

array_1

Array
(
    [0] => Array
        (
            [email] => Array
                (
                    [0] => mail@domain.de
                )

            [ID] => 489
        )

)

array_2

Array
(
    [0] => Array
        (
            [email] => Array
                (
                    [0] => test@domain.de
                )

            [ID] => 13
        )

    [1] => Array
        (
            [email] => Array
                (
                    [0] => mail@domain.de
                    [1] => yourmail@domain.de
                )

            [ID] => 48
        )

)

现在我想检查一下,array_2 中是否存在邮件地址“mail@domain.de”(array_1[0]['email'][0])。如果是的话:我需要知道array_2的key,邮件地址是在哪里找到的。

我试过array_search(),但这似乎不适用于多数组。 你能帮我吗?谢谢!!

array_1 var_export()

array (
  0 => 
  array (
    'email' => 
    array (
      0 => 'mail@domain.de',
    ),
    'customerID' => '489',
  ),
)

array_2 var_export()

array (
  0 => 
  array (
    'email' => 
    array (
      0 => 'test@domain.de',
    ),
    'customerID' => '13',
  ),
  1 => 
  array (
    'email' => 
    array (
      0 => 'mail@domain.de',
      1 => 'yourmail@domain.de',
    ),
    'customerID' => '48',
  ),
)

【问题讨论】:

  • 那么,这个问题的答案是048?
  • 结果应该是array_2[1],因为这是在array_2中找到邮件的键
  • 好的,结果应该是1
  • 是的,应该是1
  • 我更新了我的第一篇文章

标签: php arrays multidimensional-array


【解决方案1】:

您可以尝试使用array_walk_recursive
一个粗略的例子:

$email = 'mail@domain.de'

function checkEmail($item, $key)
{
    if ($item === $email) {
       echo $key;
    }
}

array_walk_recursive($array2, 'checkEmail');

更多信息请参阅文档https://www.php.net/manual/en/function.array-walk-recursive.php

【讨论】:

  • 函数$email内部checkEmail()的值是多少?
【解决方案2】:

由于您需要找到它的子数组索引,因此您可以

  • 循环每个子数组并调用一个搜索函数,比如checkValueExistence,它根据搜索结果返回truefalse。如果函数返回true,则返回索引,否则-1false 表示找不到值(在您的情况下为电子邮件)。

  • checkValueExistence 将简单地遍历手头的数组,并检查是否有任何值与提供的值匹配,如果上下文中的当前迭代值本身是一个数组,它会递归地为这个新的子数组调用自身。

片段:

<?php
    
function getValueIndex($data, $val){
    foreach($data as $idx => $d){
        if(checkValueExistence($d, $val) === true){
            return $idx;
        }
    }
    
    return false;
    // you could also throw an exception via throw new \Exception("$val is not found in the dataset"); and a try-catch block in the callee code 
}

function checkValueExistence($data, $val){
    foreach($data as $value){
        if(is_array($value) && checkValueExistence($value, $val) || !is_array($value) && $value === $val) return true;
    }
    return false;
}

echo getValueIndex($data, 'mail@domain.de');

Online Demo

【讨论】:

  • 感谢您的支持。但是您的示例只有一个数组。我的示例显示了 2 个数组。这是个问题吗?
  • @Ghost108 不是真的.. 我只是在这里手动提供了电子邮件echo getValueIndex($data, 'mail@domain.de');
  • 啊,我明白了!我根据我的情况尝试了它并且它有效!谢谢 !但是没有“更简单”的方法可以做到这一点??
  • @Ghost108 恐怕不太可能存在更简单的方法。如果我找到了,我会 ping 给你
  • 不完全了解your -1 最佳实践的来源。只需返回false
【解决方案3】:

您可以将array_filterarray_search 结合使用。如果找到一个数组,它会自动转换为布尔值(真/假),从而返回父数组。

更新:array_search 返回值的索引:如果索引为 0,则将其强制转换为 false,因此应对 false 进行严格类型检查以修复所有错误。

See it working over at 3v4l.org

array_filter($array, fn($x) => array_search('yourmail@domain.de', $x['email']) !== false);

输出:

Array
(
    [1] => Array
        (
            [email] => Array
                (
                    [0] => mail@domain.de
                    [1] => yourmail@domain.de
                )

            [customerID] => 48
        )

)

更新:如果 array_search 抛出意外结果,请尝试改用 in_array

array_filter($array, fn($x) => in_array('yourmail@domain.de', $x['email']));

更新:任何空结果,没有上下文,我认为它不是一个数组,实际上是一个字符串,所以你可以将检查附加到函数:

&& is_array($x['email']) && !empty($x['email'])

【讨论】:

  • 这看起来不错!我喜欢 !但是有一个“错误”吗?我得到了正确的结果,但我也得到了第二个结果,其中 ['email'] 为空。
  • 提供一个完整的、简约的数据示例,我会修复它。您提供的示例没有空值。 @Ghost108
  • 一个假设,没有任何上下文来解释你所说的空,尝试添加&amp;&amp; is_array($x['email']) &amp;&amp; !empty($x['email']),或类似的。 @Ghost108
  • 是的,这行得通!完美的 !非常感谢您 !! :)
  • 不用担心。您可能只使用in_array 并在此处补贴array_search。乐意效劳。 @Ghost108
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2011-05-20
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多