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