0

この関数をどのように改善しますか: 次のいずれかのフィールド名の配列を検索します。

  • a) 完全一致
  • b) 文字列が次で始まるかどうかをチェックする "_" を持つ存在
  • c) 文字列が "_" で終わっているかチェック

たとえば、列名のリストがあります。

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;
}
4

2 に答える 2

0

マークのソリューションから適応。

if(substr($str, 0, 1) === '_' || substr($str, -1) === '_') {
    // it starts or ends with an underscore
} else if($str == $match) {
    // it's the same
}

私はあなたの質問を完全には理解していません。

于 2013-01-16T17:13:22.203 に答える
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;
 }
于 2013-01-16T17:31:45.557 に答える