在与现有值比较之前删除字符串的一部分

Remove portion of the string before compare with existent values

我有一个具有以下结构的数组:

$arr = [
     traveler_name_1 => 'value',
     hotel_name_1    => 'value',
     hotel_in_date_1 => 'value',

     traveler_name_2 => 'value',
     hotel_name_2    => 'value',
     hotel_in_date_2 => 'value',

     traveler_name_n => 'value',
     hotel_name_n    => 'value',
     hotel_in_date_n => 'value',
];

我想检查没有索引的字符串是否有效并且被允许。例如:

$allowed_values = [
    'traveler_name',
    'hotel_name',
    'hotel_in_date'
];

简单的方法是将 $arr 作为 $key => $value 对进行迭代,然后生成 in_array() 但为此我需要先删除字符串的最后一部分,因为示例:

traveler_name_1 => remove the _1
hotel_name_1    => remove the _1
hotel_in_date_1 => remove the _1

所以我可以在 $allowed_values 数组中查找它们。

所以问题是如何从字符串中删除该部分?

第二个 _ 之后的值是动态生成的,因此它们的长度不是固定的。之前的值是常量。

如果您有更好的验证方法,请告诉我

一种方法(可能不是最有效的方法)是这样做的:

$s = "traveler_name_24872";
$arr = explode("_", $s);
array_pop($arr);
$s2 = implode("_", $arr); // traveler_name

根据您希望如何处理数据,这 return 正是您要查找的内容。然后,您可以将 $index 和 $value 放入一个新数组中,或者只在该 foreach 循环中操作数据。

这 return 是减去最后两个字符的完整字符串(通过 -2)。如果你想 return 除最后 3 个字符之外的所有字符,你可以将 -2 替换为 -3,等等

foreach ($arr as $key => $value) {
   $index = substr($key, 0, -2);
}

经过一些尝试,我找到了解决方案,这就是我要找的:

foreach ($arr as $key => $value) {
    if (!in_array(substr(key($key), 0, strrpos(key($key), '_')), $allowed_values, true)) { 
        echo 'Not allowed'; 
        break;
    }
}

还是谢谢你