将PHP数组值与字符串的PART进行比较

时间:2015-07-29 03:26:35

标签: php arrays substring

我正在尝试通过我的在线银行对帐单自动筛选。这是我需要的一个简单例子。

我有一系列餐厅,我根据这些餐厅对信用卡账单进行排序:

$restaurants = array(
    array("vendor" => "default",
            "type" => "default"
    ),
    array("vendor" => "dunkin",
            "type" => "pastry"
    ),
    array("vendor" => "mcdonald",
            "type" => "fastfood"
    ),
    array("vendor" => "olive",
            "type" => "italian"
    )
);

语句条目本身可以是一个相当描述性的字符串:

$string = "McDonald's Restaurants Incorporated";

我已尝试使用array_searchin_array,但它们似乎与我需要的相反,或者他们需要完全匹配,如下例所示,但这不是我需要的:

$result = array_search($string, array_column($restaurants, 'vendor'));
return $restaurants[$result]['type'];

// returns "default" because "McDonald's Restaurants Incorporated" != "mcdonald"

我希望能够将数组值“mcdonald”与包含该块的任何字符串匹配,然后为其返回“fastfood”类型。不要担心处理多次事件。

4 个答案:

答案 0 :(得分:2)

您需要综合各种事物 - a search-in-string method, and for it to be case insensitive

您可以通过以下方式完成此任务:

/**
 * Perform a string-in-string match case insensitively
 * @param  string $string
 * @param  array  $restaurants
 * @return string|false
 */
function findRoughly($string, $restaurants)
{
    $out = false;
    foreach ($restaurants as $restaurant) {
        // Set up the default value
        if ($restaurant['type'] == 'default' && !$out) {
            $out = $restaurant['type'];
            // Stop this repetition only
            continue;
        }
        // Look for a match
        if (stripos($string, $restaurant['vendor']) !== false) {
            $out = $restaurant['type'];
            // Match found, stop looking
            break;
        }
    }
    return $out;
}

并像这样使用它:

$result = findRoughly("McDonald's", $restaurants);

Example here.

答案 1 :(得分:2)

我不认为PHP中的一个函数会像你想要的那样干净利落地处理它。但你可以用一个快速的函数循环遍历数组寻找匹配项:

$type = call_user_func( function( $restaurants, $string ) {
    foreach ( $restaurants as $restaurant ) {
        if ( stripos( $string, $restaurant['vendor'] ) !== FALSE ) {
            return $restaurant['type'];
        }
    }

    return $restaurant[0]['type'];
}, $restaurants, $string );

如果$string是" McDonald's Restaurants Incorporated",那么$type将是"快餐"。如果没有指定的值匹配,则上面假设数组中的第一个实例是您的默认返回。

我刚刚将这个作为一个匿名函数/闭包构建出来以方便起见,我通常会把它干净地包含在我打算运行一次的东西中。但它可能在您的应用程序中作为命名函数更清晰。

答案 2 :(得分:0)

我使用array_maparray_filter采用了不同的(功能性)方法。由于使用内置函数,它相当紧凑,并且完成了工作。

$result = file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address=6+QUAI+DE+LORIENT+94569+RUNGIS+CEDEX');
var_dump(json_decode($result));

$result = file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address=6+QUAI+DE+LORIENT+94569+RUNGIS+CEDEX,FR');
var_dump(json_decode($result));

答案 3 :(得分:-1)

我注意到问题的in_array部分。编辑它以改为使用strpos。

试试这个:

foreach($restaurants as $restaurant)
{
     if(strpos($restaurant['vendor'], $string) !== FALSE)
     {
          return $restaurant['type']; //Or add to an array/do whatever you want with this value.
     }
}

http://php.net/manual/en/function.strpos.php