如果你有一个循环填充的数组$ p,那么:
$p[] = array( "id"=>$id, "Name"=>$name);
在Name键中搜索John的最快方法是什么,如果找到,返回$ p索引?除了循环$ p之外还有其他方法吗?
我在$ p中有多达5000个名字,而$ p也可能包含5000行。目前我循环遍历$ p查找每个名称,如果找到,解析它(并将其添加到另一个数组),将行拼接出$ p,并打破1,准备开始搜索5000个名称中的下一个。
我想知道是否有更快的方法来获取索引而不是循环通过$ p,例如isset类型的方式?
感谢您一起来看看。
答案 0 :(得分:4)
好的,所以当我看到这个问题时,你有唯一的ID,但名称可能不是唯一的。
您可以将数组初始化为:
array($id=>$name);
您的搜索结果如下:
array_search($name,$arr);
这将非常有效,因为在大海捞针中查找针的本地方法将比您自己的实现具有更好的实现。
e.g。
$id = 2;
$name= 'Sunny';
$arr = array($id=>$name);
echo array_search($name,$arr);
回应2
此方法的主要优点是代码可读性。
答案 1 :(得分:1)
如果您知道在同一请求中需要执行许多这类搜索,则可以从中创建索引数组。这将为您需要创建的每个索引循环一次数组。
$piName = array();
foreach ($p as $k=>$v)
{
$piName[$v['Name']] = $k;
}
如果您只需要每页执行一次或两次搜索,请考虑将阵列移动到外部数据库,并在那里创建索引。
答案 2 :(得分: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中元素的所有索引,其中键Name
的元素的值为John
。 (这当然只适用于以0开头并且在索引中没有“漏洞”的数字索引的数组。)
编辑:可能更容易使用array_filter
,但这不会仅返回索引,而是Name
等于John
的所有数组元素 - 但索引将被保留:< / p>
$result2 = array_filter($p, function($elem) {
return $elem["Name"] == "John" ? true : false;
});
var_dump($result2);
更适合您的需求。哪一个可能更快,是你想出来的。