【问题标题】:PHP array_filter get value without keyPHP array_filter 在没有键的情况下获取值
【发布时间】:2020-07-10 18:27:49
【问题描述】:

我来自 Javascript 背景,我正在尝试使用 array_filter(),但它的工作方式与 JS 完全不同。

以这个 JS 为例:

const people = [
  {
    name: 'Will',
    username: 'will',
  },
  {
    name: 'Alex',
    username: 'alex',
  },
  {
    name: 'Abraham',
    username: 'abraham',
  },
];

const usernameToFind = 'abraham';

const found = people.filter(person => person.username === usernameToFind);

console.log(found[0]); // index 0

// {
//   name: 'Abraham',
//   username: 'abraham'
// }

我希望所有的用户名都不同,所以它总是只返回一个值。所以如果我想访问找到的信息,我只需要索引0

在 PHP 上:

<?php

$people = [
  [
    'name' => 'Alex',
    'username' => 'alex',
  ],
  [
    'name' => 'Will',
    'username' => 'will',
  ],
  [
    'name' => 'Abraham',
    'username' => 'abraham',
  ],
];

$usernameToFind = 'abraham';

$found = array_filter($people, function($person) use ($usernameToFind) {
  return $person['username'] === $usernameToFind;
});

print_r($found);

// Array
// (
//     [2] => Array
//         (
//             [name] => Abraham
//             [username] => abraham
//         )
// )

所以我的问题是:我得到一个包含找到元素索引的数组,但我不知道索引是什么。

我看到了这个问题,但它完全不同:PHP array_filter to get only one value from an array

我没有使用array_search(),因为我的搜索针有 2 或 3 层深,例如:

array_filter($people, function ($person) use ($cityToFind) {
   return $person['location']['city'] === $cityToFind;
}

我可以使用 for 循环,但我真的想使用过滤器。提前致谢!

【问题讨论】:

    标签: php arrays array-filter


    【解决方案1】:

    你可以做几件事。

    1. 要获取数组的第一个元素,您可以使用 reset($found) https://www.php.net/manual/en/function.reset.php

    2. 过滤数组后,您可以使用 array_values($found) 将数组键重置为从 0 开始 https://www.php.net/manual/en/function.array-values.php

    【讨论】:

      【解决方案2】:

      使用array_filter() 将始终处理整个数组,在您的示例中,它是最后一个条目,因此无论如何它都需要。但是如果你有 500 个条目并且它是第一个,它仍然会检查所有 500 个条目。

      相反,您可以使用一个简单的foreach() 循环,它会在找到第一个循环后立即停止...

      foreach ( $people as $index => $person )    {
          if ( $person['username'] === $usernameToFind )  {
              echo "Index={$index} name={$person['name']}";
              break;
          }
      }
      

      给...

      Index=2 name=Abraham
      

      作为对原始问题的回答 - 您可以使用 After array_filter(), how can I reset the keys to go in numerical order starting at 0 重置密钥,以便使用 [0]

      【讨论】:

      • 我不会使用 foreach 而不是 array_filter 来读取性能:您根据最坏的情况计算复杂度,而不是“如果这个问题的实例更容易”。此外,您必须得到一个非常长的数组(十万个项目)才能满足实际的性能要求。
      • @smwhr,我不计算理论的复杂性,更多的是实际应用。 array_filter() 不是要在数组中找到 1 个条目 - 它可以从数组中选择多个项目,不同的用例。
      • 我知道,在 PHP 中没有 uarray_search 方法是一件很痛苦的事情(让我们想象一个可以推断二分搜索并提高有序数组的实践和理论复杂性的方法)。也就是说,我对 foreach/break 模式也有争执,因为它在调试错误时会引起很多麻烦。
      猜你喜欢
      • 2011-10-18
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2022-01-21
      • 2011-06-04
      相关资源
      最近更新 更多