我有这个数组样本:
array(3) {
[0]=> string(20) "1845-260-phone-nokia"
[1]=> string(22) "1133-0-phone-motorola"
[2]=> string(20) "1133-0-phone-samsung"
}
我的目标是搜索数组并查找数组中是否存在字符串。
首先让我解释一下这个字符串的含义:
"1845-260-phone-nokia"
1845年 - 产品编号
260 - 这是可变的,它是未知的
电话 - 是产品制造
诺基亚是产品型号
众所周知,排除变量..
我如何搜索数组,如果我有:
[0]=> string(20) "18451-260-phone-nokia"
被认可为不同的产品 我希望你能理解我的意思。直到现在我使用了in_array,但是在最近在字符串中添加变量之后,这不起作用.. 谢谢你的帮助!
答案 0 :(得分:1)
在尝试实现您未使用explode()
函数调用的愿望时,我创建了两个可以使用型号和制造商匹配的函数。第一个函数使用正则表达式匹配,而第二个函数使用字符串操作。性能明智我不知道。它们可以适当地优化A LOT,但功能应该在那里。
正则表达式版本的优势在于它可以捕获未知数字。如果您不想要这个功能,可以很容易地重构。但我的猜测是它有点重要。如果没有,那么为什么要把它存放在第一位:D
/**
* Finds the first matching phone using a regular expression.
*
* @param array $phones An array of available phones
* @param string $model The model number of the phone
* @param string $manufacturer The manufacturer of the phone
*
* @return array|bool Returns an associative array with matched phone and the
* unknown number on success. Returns FALSE if no match.
*/
function find_phone_regex(array $phones, $model, $manufacturer) {
/*
* OPS: I have added the 'i' flag to make it case-insensitive.
* This might not be the wished behavior.
*/
$regex = '~^' . $model . '-(?<number>[0-9]+)-phone-' . $manufacturer . '$~i';
foreach($phones as $phone) {
if(preg_match($regex, $phone, $matches)) {
return [
'phone' => $phone,
'number' => $matches['number']
];
}
}
return false;
}
/**
* Finds the first matching phone.
*
* @param array $phones An array of available phones
* @param string $model The model number of the phone
* @param string $manufacturer The manufacturer of the phone
*
* @return string|bool Returns the phone on success. Returns FALSE if it does not exist.
*/
function find_phone_string(array $phones, $model, $manufacturer) {
$input_model_pos = strlen($model);
$input_manufacturer_pos = strlen($manufacturer);
$model = strtolower($model);
$manufacturer = strtolower($manufacturer);
foreach($phones as $phone) {
$phone_model = substr($phone, 0, $input_model_pos);
$phone_manufacturer = substr($phone, -$input_manufacturer_pos);
if(strtolower($phone_model) == $model && strtolower($phone_manufacturer) == $manufacturer) {
return $phone;
}
}
return false;
}
关于参数列表,它们的用法是相同的。只有功能名称不同。使用您提供的数据,这两个函数将返回以下内容(显示var_dump()
)。
正则表达式版本。
$phone = find_phone_regex($phones, '1845', 'nokia');
array (size=2)
'phone' => string '1845-260-phone-nokia' (length=20)
'number' => string '260' (length=3)
字符串版本。
$phone = find_phone_string($phones, '1845', 'nokia');
string '1845-260-phone-nokia' (length=20)
答案 1 :(得分:0)
$array = array("1845-260-phone-nokia", "1133-0-phone-motorola", "1133-0-phone-samsung");
$search = 'nokia';
$results found = array();
foreach ($array as $key => $value){
if (strpos($value, $search) !== false)
$results_found[] = $value;
}
echo 'following results found: '.implode('<br>', $results_found);