PHP:搜索数组相似数据库;例如%key%";
我有一个具有以下格式的数组:PHP:搜索数组相似数据库;例如%key%";,php,arrays,Php,Arrays,我有一个具有以下格式的数组: countries( [0] = Array ( [0] = 1 [1] = USA ) [1] = Array ( [0] = 93 [1] = Afghanistan ) [2] = Array ( [0] = 358
countries(
[0] = Array
(
[0] = 1
[1] = USA
)
[1] = Array
(
[0] = 93
[1] = Afghanistan
)
[2] = Array
(
[0] = 358
[1] = Finland
)
)
=======
[0] country code
[1] country name
我想搜索这个数组以获得该号码所属的国家
例如:
35854554,如何搜索数组以获得哪个国家,在本例中=芬兰
请考虑一下性能,所以我想用最快的方式< /P>
if (strpos($string, $word) === FALSE) {
... not found ...
}
请注意,strpos
区分大小写,如果要进行不区分大小写的搜索,请使用stripos()
还要注意==
,强制执行严格的相等性测试<如果“针”字符串位于“干草堆”的开头,则code>strpos可以返回有效的0。通过强制检查实际的布尔值false(也称为0),可以消除该误报
$countries = array(
array('1','USA'),
array('93','Afghanistan'),
array('358','Finland'),
array('3','India')
);
$input_code = '358545454554';
$searched = array();
foreach($countries as $country) {
if (strpos($input_code, $country[0]) !== FALSE)
$searched[] = $country[1];
}
print_r($searched);
请访问此处()
您可以为此使用数组过滤器。第一种变体搜索国家ID中的任意位置的数字,因此358154554与美国和芬兰匹配,第二种变体使用正则表达式仅过滤以相同数字开头的ID
$data = array(
array(1, 'USA'),
array(93, 'Afghanistan'),
array(358,'Finland')
);
$term = '358545454554';
// in case you want to match it anywhere in the term string...
$result = array_filter($data, function($elem) use($term) {
return (strpos((string) $term,(string) $elem[0]) !==false ) ? true : false;
});
var_dump($result);
// in case you want to match only from start
$result = array_filter($data, function($elem) use($term) {
return preg_match('/^'.$elem[0].'/',$term);
});
var_dump($result);
35854554是数组还是字符串?如果您试图查看数字是否以每个数组元素的区号开头,那么期望看到某种循环是否过高?检查strpos==true
依赖于非常可疑的强制转换strpos
只能返回false
或数字。另外,你基本上是在模仿,没有什么好的理由。他想搜索数字,所以我认为区分大小写与此无关。对于这样的问题,我通常不会对任何答案投赞成票,但其他答案都令人震惊。我知道这个答案,但我正在寻找更好的解决方案,得到非常好的结果fast@Ali整个程序在ideone.com上执行大约0.01秒,包括php预热。如果你想要一个更快的程序,你必须有更好的数据结构,例如一个你可以导航的所有国家的数据库。在任何情况下,此代码都不可能是应用程序中最慢的代码。很可能,从数据库中获取对象会使它们与国家的关联相形见绌。@phihag谢谢,但在我的例子中,我们有1000000个手机号码,希望通过for loop获得每个号码所属的国家array\u filter
工作正常,但这意味着如果99%的客户在美国,则运行时间将乘以200,因为所有国家都是经过评估的。
$data = array(
array(1, 'USA'),
array(93, 'Afghanistan'),
array(358,'Finland')
);
$term = '358545454554';
// in case you want to match it anywhere in the term string...
$result = array_filter($data, function($elem) use($term) {
return (strpos((string) $term,(string) $elem[0]) !==false ) ? true : false;
});
var_dump($result);
// in case you want to match only from start
$result = array_filter($data, function($elem) use($term) {
return preg_match('/^'.$elem[0].'/',$term);
});
var_dump($result);