5

如果您在循环中填充了任何数组 $p ,如下所示:

$p[] = array( "id"=>$id, "Name"=>$name);

在 Name 键中搜索 John 的最快方法是什么,如果找到,返回 $p 索引?除了循环 $p 之外,还有其他方法吗?

我在 $p 中最多可以找到 5000 个名称,并且 $p 也可能包含 5000 行。目前,我循环遍历 $p 以查找每个名称,如果找到,解析它(并将其添加到另一个数组),将行从 $p 中拼接出来,然后中断 1,准备开始搜索 5000 个名称中的下一个。

我想知道是否有一种更快的方法来获取索引而不是循环通过 $p 例如 isset 类型的方式?

谢谢大家看看。

4

3 回答 3

5

好的,当我看到这个问题时,您有唯一的 ID,但名称可能不是唯一的。

您可以将数组初始化为:

array($id=>$name);

您的搜索可以是:

array_search($name,$arr);

这将非常有效,因为在大海捞针中寻找针的本机方法将具有比您自己的实现更好的实现。

例如

$id = 2;
$name= 'Sunny';
$arr = array($id=>$name);
echo array_search($name,$arr);

回声 2

这种方法的主要优点是代码可读性。

于 2013-10-14T11:05:24.497 回答
1

如果您知道您将需要在同一个请求中执行许多这些类型的搜索,那么您可以从它们创建一个索引数组。这将在您需要创建的每个索引中循环一次数组。

$piName = array();
foreach ($p as $k=>$v)
{
  $piName[$v['Name']] = $k;
}

如果您只需要每页执行一到两次搜索,请考虑将数组移动到外部数据库中,并在那里创建索引。

于 2013-10-14T10:48:54.293 回答
0
$index = 0;
$search_for = 'John';
$result = array_reduce($p, function($r, $v) use (&$index, $search_for) {
  if($v['Name'] == $search_for) {
    $r[] = $index;
  }
  ++$index;
  return $r;
});

$result 将包含 $p 中元素的所有索引,其中 key 的元素具有Namevalue John。(这当然只适用于以 0 开头的数字索引并且索引中没有“洞”的数组。)


编辑:可能更容易使用array_filter,但这不会只返回索引,而是所有Name等于的数组元素John- 但索引将被保留:

$result2 = array_filter($p, function($elem) {
  return $elem["Name"] == "John" ? true : false;
});
var_dump($result2);

什么更适合您的需求,分别。哪个可能更快,由您自己弄清楚。

于 2013-10-14T11:06:36.523 回答