【问题标题】:PHP - Get multidimensional array value based on the value of another parameter [duplicate]PHP - 根据另一个参数的值获取多维数组值[重复]
【发布时间】:2017-08-30 10:00:46
【问题描述】:

想象一下我有这个数组:

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

现在,我的问题是:如何获取参数“名称”的值,其中电子邮件与我的变量匹配。 因此,如果我的 $user->user_email 等于“a@a.com”,我需要名称值,即“a”。 php可以吗?

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    试试这个:

    $index = array_search($user->user_email, array_column($array, 'email'));
    if ($index !== false) $name = $array[$index]['name'];
    

    这依赖于 array_column 创建的运行时数组保留了我相信提取项目的顺序这一事实。因此,从此数组中读取的索引可用于引用原始数组。

    【讨论】:

      【解决方案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
      )
      

      【讨论】:

        【解决方案3】:

        就效率而言,此任务的目标是以最少的迭代次数执行数组搜索,并保证数组的迭代次数永远不会超过一个完整时间(这是n 的一个大 O)。

        此页面上任何在开始搜索之前就使用array_column()(或经典循环)准备数据的答案已经失去了作为一种有效技术的资格。

        最高效的技术是迭代数组以使用早期的breakarray_search() 在后台使用了提前中断,但不幸的是它需要先调整数据结构。

        使用任何函数式迭代器都无法使用提前中断,因此它们也可以打折。

        这是最适合使用经典循环的时候。使用条件中断,sn-p 永远不会重复超过必要的次数来找到匹配项。

        代码:(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'
        

        【讨论】:

          【解决方案4】:

          使用array_search insted of 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】:

            试试这个;

            $name = $array[array_keys(array_column($array, 'email'), $user->user_email)[0]]['name'];
            

            PD:(此代码仅获取搜索的第一个元素)

            【讨论】:

            • 这个答案的大 O 是 2n
            【解决方案6】:
            $name = "";
            
            foreach($array as $key => $value)
            {
                if($value["email"] == $user->user_email)
                {
                    $name = $array[$key]["name"];
                }
            
            }
            

            【讨论】:

            • $name = $value['name']; 更快更清晰。你也可以在后面加上break;
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-03
            • 1970-01-01
            • 2023-03-03
            • 2017-11-16
            相关资源
            最近更新 更多