现在为我的脚本编写此函数。它运作良好,但有点慢。考虑一下这个功能,如果你有最佳选择,可以请我帮忙。
这是我的代码:
function izada($array) {
foreach ($array as $key => $value) {
if(substr_count($value, "ӣ") == 2) {
$result[] = str_replace("ӣ ", "ӣ, ", $value);
}
if(mb_substr($value, -1) !== "ӣ") {
unset($array[$key]);
}
if(substr_count($value, "ӣ") == 2) {
unset($array[$key]);
}
$array = array_filter(array_unique(array_merge($array, $result)));
}
foreach ($array as $key => $value) {
if(substr_count($value, "ӣ") > 2 || substr_count($value, "ӣ") < 1) {
unset($array[$key]);
}
}
return $array;
}
输入和函数调用:
$array = array (
"забони тоҷикӣ",
"хуҷандӣ бӯстонӣ",
"Тоҷикистон Ватанам",
"Ғафуровӣ Мичуринӣ Савхозӣ",
"Конверторӣ хуруфҳо"
);
$array = izada($array);
echo"<pre>";
print_r($array);
echo"</pre>";
结果必须是:
Array (
[0] => забони тоҷикӣ
[1] => хуҷандӣ, бӯстонӣ
)
答案 0 :(得分:2)
Jakub的答案未经过优化,根据您发布的方法可能不正确。
它允许使用2 value但不以ӣ结束的值的可能性。 (如果这是可以接受的,那么你应该澄清你的问题要求。)
每次迭代调用substr_count()
1到3次(取决于条件结果)。效率要考虑的重要因素是最小化函数调用。
这是一个更准确/更有效的流程:
输入:
$array=[
"забони тоҷикӣ",
"хуҷандӣ бӯстонӣ",
"Тоҷикистон Ватанам",
"Ғафуровӣ Мичуринӣ Савхозӣ",
"Конверторӣ хуруфҳо"
];
方法:(Demo)
foreach($array as $v){
if(mb_substr($v,-1)=="ӣ"){ // require last char to be ӣ
if(($count=substr_count($v,"ӣ"))==1){
$result[]=$v; // do not replace if only 1 ӣ
}elseif($count==2){
$result[]=str_replace("ӣ ","ӣ, ",$v); // replace qualifying ӣ's if 2 ӣ's
}
}
}
var_export($result);
输出:
array (
0 => 'забони тоҷикӣ',
1 => 'хуҷандӣ, бӯстонӣ',
)
请注意,我的方法首先要求最终字符为ӣ
,这样可以提供最快的回报,而不会为非限定值声明/覆盖$count
。
$count
用于缓存每次迭代的substr_count()
结果。通过这样做,迭代只需要调用一次函数 - 提高效率。
答案 1 :(得分:1)
所有array_merge
和array_unique
都占用了不必要的资源。而不是试图改变原始数组,为什么不创建一个输出数组并用你想要的数据填充它?
还有几个多余的条件 - 你要多次检查同一件事。根据我的理解,这就是你想要的:
返回ӣ
存在一次或两次的所有字符串,最后一次或两次。如果它出现两次,请添加昏迷。
所以你可以像
一样简化它function izada($array) {
$ret = [];
foreach($array as $string){
if (substr_count($string, "ӣ") >= 1 && substr_count($string, "ӣ") <= 2) {
if(substr_count($string, "ӣ") == 2) {
$ret[] = str_replace("ӣ ", "ӣ, ",$string);
}
else if (mb_substr($string, -1) == "ӣ") {
$ret[] = $string;
}
}
}
return $ret;
}