我将如何改进此功能: 在数组中搜索以下字段名称:
E.g我有一个列名列表:
array(
'customer_name',
'customer_lastname',
'customer_streetname',
'customer_dob',
'system_modified'
)
另一个具有格式化条件的数组:
array(
'_dob' => 'date_dob',
'_name' => 'varchar',
'customer_name' => 'html_text',
'system_' => 'required'
)
结果根据列名应用条件:
1. customer_name = html_text (exact matches have higher preference)
2. customer_lastname = varchar
3. customer_streetname =
4. customer_dob = dob
5. system_modified = required
目前有这个:
protected function matchPatterns($string) {
$return = array();
$parrerns = $this->_normaliseArrayItem($this->getPatterns());
foreach ($parrerns as $match) {
// If exact match
if($string == $match) {
$return[] = $match;
break;
// Else if begins with _ and ends with string.
} elseif($string[0] == "_" && substr_compare($string, $match, -strlen($match), strlen($match)) === 0) {
$return[] = $match;
}
} // end loop
return $return;
}
/**
* Return an array of validation patterns.
*
* @return string[]
*/
public function getPatterns() {
return $this->_patterns;
}
/**
* Returns an item as array rather than single item.
*
* @param string[] $data
* @return string[]
*/
protected function _normaliseArrayItem($data) {
if(!isset($data[0])|| !is_array($data)) {
$tmp[] = $data;
$data = $tmp;
}
return $data;
}
答案 0 :(得分:0)
改编自Marc的解决方案。
if(substr($str, 0, 1) === '_' || substr($str, -1) === '_') {
// it starts or ends with an underscore
} else if($str == $match) {
// it's the same
}
我不完全理解你的问题。
答案 1 :(得分:0)
foreach ($parrerns as $match => $format) {
// If exact match
if($string == $match) {
$return[] = $format;
break;
// Else if begins with _ and string ends with it.
} elseif($match[0] == "_" && substr_compare($string, $match, -strlen($match), strlen($match)) === 0) {
$return[] = $format;
// Else if ends with _ and string begins with it
} eleif (substr($match, -1) == "_" && substr_compare($string, $match, 0, strlen($match)) == 0) {
$return[] = $format;
}