我有两个数组,即:
array('ly', 'ful', 'ay')
和
array('beautiful', 'lovely', 'power')
我想打印后缀与第一个数组匹配的第二个数组的内容。即输出应该是lovely
, beautiful
。
我怎样才能在 PHP 中做到这一点?
尝试这个
$suffix=array('ly','ful','ay');
$words = array('beautiful','lovely','power');
$finalarray=array();
foreach($words as $word)
{
foreach($suffix as $suff)
{
$pattern = '/'.$suff.'$/';
if(preg_match($pattern, $word))
{
$finalarray[]=$word;
}
}
}
print_r($finalarray);
您可以在http://writecodeonline.com/php/上在线测试
输出
Array ( [0] => beautiful [1] => lovely )
这应该给你你想要的,假设顺序在结果数组中并不重要:
$arr1 = ['ly', 'ful', 'ay'];
$arr2 = ['beautiful', 'lovely', 'power'];
$result = array_filter($arr2, function($word) use ($arr1){
$word_length = strlen($word);
return array_reduce($arr1, function($result, $suffix) use ($word, $word_length) {
if($word_length > strlen($suffix))
$result = $result || 0 === substr_compare($word, $suffix, -strlen($suffix), $word_length);
return $result;
}, false);
});
print_r($result);
/*
Array
(
[0] => beautiful
[1] => lovely
)
*/
尝试使用array_filter()
有效的回调。在您的情况下,我建议查看正则表达式(preg_replace()
或preg_match()
)。
<?php
header('Content-Type: text/plain');
$a = array('beautiful','lovely','power');
$b = array('ly','ful','ay');
$filters = array_map(function($filter){ return '/' . $filter . '$/'; }, $b);
$c = array_filter(
$a,
function($element)use($filters){ return $element != preg_replace($filters, '', $element); }
);
var_dump($c);
?>
显示:
array(2) {
[0]=>
string(9) "beautiful"
[1]=>
string(6) "lovely"
}
UPDv1:
更简短和优化的版本preg_match()
:
<?php
header('Content-Type: text/plain');
$a = array('beautiful','lovely','power');
$b = array('ly','ful','ay');
$filter = '/^.*(' . implode('|', $b) . ')$/';
$c = array_filter(
$a,
function($element)use($filter){ return preg_match($filter, $element); }
);
var_dump($c);
?>
相同的输出。
这应该有效:
$suffixes = array('ly','ful','ay');
$words = array('beautiful','lovely','power');
foreach($suffixes as $suffix){
foreach($words as $word){
if(strripos($word, $suffix) == strlen(str_replace($suffix, '', $word))){
$results[] = $word;
}
}
}
print_r($results);
您绝对可以优化它并使其更短,但它很容易理解并且是一个很好的起点。