【问题标题】:Inserting an item after specific array pattern在特定数组模式之后插入项目
【发布时间】:2016-11-14 14:13:53
【问题描述】:

我想在特定模式之后插入一个项目。在我的情况下,我想在数组中的每一秒 a 之后插入 x。在第六次a 之后,我的代码无法正常工作:

$array = array("a","a","a","a","a","a","b","a","a");

$out = array();
foreach ($array as $key=>$value){
    $out[] = $value; // add current letter to new array
    if($value=='a' && $array[$key-1]=='a' && $out[$key] !='x'){ // check if current and last letter are a
        $out[] = 'x'; // if so add an x to the array
    }
}

print_r($out);

【问题讨论】:

  • @AniketSahrawat 正则表达式用于字符串。
  • 我以为他想在每个x 之后添加a,没有看到数组。
  • @u_mulder,其实这里可以使用正则表达式。请看我的回答。
  • @sevavietl 如果 OP 向我们展示了简化的示例会怎样。如果他有对象而不是"a" 怎么办?其他数组?
  • @u_mulder,对不起,我不知道我们正在阅读茶叶。但是,无论如何,我指定了在这种特殊情况下使用正则表达式。我完全同意,在更复杂的情况下,这种方法是行不通的。但是,如果任务像声明的那样简单,则无需重新发明正则表达式并处理循环。

标签: php arrays key pattern-matching


【解决方案1】:

最后正确答案

这就是你要找的吗?

<?php
$array = array("a","a","a","a","a","a","b","a","a");
foreach ($array as $key => $value){
    if ($key == 0 || $key == 1) {
        $array[$key] = $value; 
    } elseif($array[$key-1] == 'a' && $array[$key-2] == 'a' && $array[$key] == 'a') {
        $array[$key] = 'x';
    } else {
        $array[$key] = $value; 
    }
}
$count = count($array);
if ($array[$count-1] == 'a' && $array[$count-2] == 'a') {
    $array[] = 'x';
}
print_r($array);
?>

如果我理解正确,在 2 a 之后,您想将 x 放入新数组中。

更新

请立即检查。如果数组中的最后两个是a,则将添加一个新元素x

有例外,但仍然有效:

<?php
$array = array("a","a","a","a","a","a","b","a","a");
foreach ($array as $key => $value){
    if($array[$key-1] == 'a' && $array[$key-2] == 'a' && $array[$key] == 'a') {
        $array[$key] = 'x';
    }
}
$count = count($array);
if ($array[$count-1] == 'a' && $array[$count-2] == 'a') {
    $array[] = 'x';
}
print_r($array);
?>

更新 - 正确代码

我认为下面的代码将满足您的所有需求:

<?php
$arr = array("a","w","a","d","a","a","b","a","a", "w");
$arr_count = count($arr);   
for ($i = 0; $i < $arr_count; $i++){
    if (!empty($arr[$i+1]) && $arr[$i] == $arr[$i+1]) {
        $first_half = array_slice($arr, 0, $i+2);
        $second_half = array_slice($arr, $i+2, $arr_count);     
        if (count($second_half) > 0) {
            $arr = array_merge($first_half, ["x"], $second_half);
        }
    }
}
$count = count($arr);
if ($arr[$count-1] == 'a' && $arr[$count-2] == 'a') {
    $arr[] = 'x';
}

print_r($arr);
?>

【讨论】:

  • 是的,您理解正确,但没有插入最后两个a x
  • 请立即查看。如果数组中的最后两个是a,我们将添加新元素x
  • 你的任务有几个条件,所以我觉得时间不长。所有工作都在那个小小的foreach 中完成。无论如何,如果它符合您的需求,如果您接受我的回答,那就太好了。我还添加了一些代码,但它会导致异常,我认为你不想要,并且将主代码更改为更短一些。
  • 如果我只有 array("a","a","b"); 模式,b 在两个代码中都被 x 替换
【解决方案2】:

正如评论中提到的,您肯定可以在这种特殊情况下使用正则表达式:

$pattern = '/a{2}/';
$replacement = '$0x';

$out = str_split(preg_replace(
    $pattern,
    $replacement,
    implode('', $array)
));

基本上,我们将字符粘合在一起(使用implode)形成字符串,然后将每个"aa" 替换为"aax"。之后,我们使用str_split 将字符串拆分回数组。

这里是demo

【讨论】:

  • 这不是解决我的问题的最优雅的方法,因为我们将它粘合在一起并再次拆分...
  • @MoeJoe,在这种情况下,优雅这个词是如此的模棱两可,你几乎可以称任何东西为“优雅”或“不优雅”。这使您的评论的语义负载为零。
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 2016-06-16
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多