过滤以特定字母结尾的多字节字符串数组,并有条件地改变保留的字符串

问题描述 投票:0回答:2

A 现在为我的脚本编写这个函数。它打字效果很好,但速度有点慢。考虑功能,如果您有最佳选择,请我帮忙。

这是我的代码:

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] => хуҷандӣ, бӯстонӣ
)
php arrays replace filtering multibyte
2个回答
2
投票

Jakub 的答案未优化,根据您发布的方法可能不正确。

  • 它允许一个值有 2 ӣ 但不以 ӣ 结尾的可能性。 (如果可以接受,那么你应该明确你的问题要求。)

  • 它每次迭代调用

    substr_count()
    1 到 3 次(取决于条件结果)。考虑效率的重要事项是尽量减少函数调用。

这是一个更准确/高效的过程:

输入:

$array=[
  "забони тоҷикӣ",
  "хуҷандӣ бӯстонӣ",
  "Тоҷикистон Ватанам",
  "Ғафуровӣ Мичуринӣ Савхозӣ",
  "Конверторӣ хуруфҳо"
];

方法:(演示

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
投票

所有的

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;

}

© www.soinside.com 2019 - 2024. All rights reserved.