2011-11-22 77 views
1

此代码重复。我怎样才能缩短它?也许通过使用匿名函数或其他?我怎样才能以更短的方式写这个?

foreach ($value as $wrong) { 
    if (starts_with($wrong, '%') and ends_with($wrong, '%')) { 
    $wrong = trim($wrong, '%'); 
    if (contains($address, $wrong)) { 
     $corrected_address = str_replace($wrong, $key, $address); 
     break; 
    } 
    } 
    else { 
    $wrong = trim($wrong, '%'); 
    if (ends_with($address, $wrong)) { 
     $corrected_address = str_replace($wrong, $key, $address); 
     break; 
    } 
    } 
} 

谢谢。

+0

为什么它在一个地方'包含'和其他时间'ends_with'?并取决于'%'的发生?听起来像一个非常模糊的任务 – SinistraD

回答

2

这是我在较短的版本刺:

foreach ($value as $wrong) { 
    $both = starts_with($wrong, '%') && ends_with($wrong, '%'); 
    $wrong = trim($wrong, '%'); 
    if ($both ? contains($address, $wrong) : ends_with($address, $wrong)) { 
     $corrected_address = str_replace($wrong, $key, $address); 
     break; 
    } 
} 

$both也许应该改名为更具描述。

+0

好:)谢谢。 – oaziz

1

如何:

foreach ($value as $wrong) { 
    $wrong = trim($wrong, '%'); 

    if (starts_with($wrong, '%') && ends_with($wrong, '%')) { 

    if (contains($address, $wrong)) { 
     $corrected_address = str_replace($wrong, $key, $address); 
     break; 
    } 

    }elseif (ends_with($address, $wrong)) { 
     $corrected_address = str_replace($wrong, $key, $address); 
     break; 
    } 
} 
1

如果您在第一个之后破坏,则不需要循环。你可以使用array_filter来获得匹配,然后对第一个匹配。

$trimmed = array_map(function($x){return trim($x,'%');}, $value); 
$matches = array_filter($trimmed, function($x){return contains($GLOBALS["address"],$x);}); 
$wrong = array_shift($matches); 
$corrected_address = str_replace($wrong, $key, $address); 

btw,注意array_map是如何首先接受回调,然后是数组第二,但是array_filter反转了吗?这就是让我避免使用php的事情。

相关问题