2016-11-14 2 views
2

Я хотел бы вставить элемент после определенного шаблона. В моем случае я хотел бы вставить x после каждой секунды a в массив. После six'th 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); 
+0

@AniketSahrawat regexps предназначены для строк. –

+0

Я думал, что он хочет добавить 'a' после каждого' x', не видел массив. –

+0

@u_mulder, regex можно использовать здесь, на самом деле. пожалуйста, см. мой ответ. – sevavietl

ответ

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 в новый массив.

UPDATE

Пожалуйста, проверьте прямо сейчас. Будет добавлен новый элемент x, если последние два находятся в массиве a.

С исключениями, но по-прежнему работает:

<?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); 
?> 

UPDATE - Правильный код

Я думаю, что ниже код будет соответствовать всем вашим требованиям:

<?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); 
?> 
+0

Да, вы поняли это правильно, но для последних двух 'a'' x' не вставлено. –

+0

Я добавлю еще один символ if, и если это будет последний два элемента в массиве как 'a', он добавит в массив новый элемент' x'. –

+0

Пожалуйста, проверьте сейчас. Мы добавляем новый элемент 'x', если последние два являются' a' в массиве. –

0

Как было упомянуто в комментарий, вы можете использовать регулярное выражение в данной ситуации:

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

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

В основном, мы приклеивание символов вместе (с использованием implode) для формирования строки, а затем заменить каждую "aa" с "aax". После этого мы разделим строку на массив с помощью str_split.

Адрес demo.

+0

Это не самый элегантный способ решить мою проблему, потому что мы склеиваем его вместе и снова разделяем ... –

+0

@MoeJoe, слово изящное в этом контексте настолько неоднозначно, что вы можете позвонить почти что-либо «элегантное» или «не изящное». Это делает смысловую нагрузку вашего комментария равной нулю. – sevavietl

Смежные вопросы