Здесь происходит несколько вещей ...
Во-первых, я не уверен, знаете ли вы, что unset
использование массива фактически не удаляет индексы:
$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[3]=>
int(3)
} */
Таким образом, вы будете иметь некоторые неопределенные смещения при переборе элементов массива. Чтобы перейти один за другим, вы должны использовать цикл foreach
.
Другая проблема заключается во вложенном цикле for:
for($i = 0; $i < (count($word_array)/2); $i = $i + 1){
for($j = count($word_array); $j > (count($word_array)/2); $j = $j - 1){
Учитывая "amanaplanacanalpanama", посмотрите, что вы делаете:
Сравнение, шаг за шагом (кстати, вы на 1 на инициализаторе отключены на $ j ... $word_array[count($word_array)]
указывает на «м» в Панаме, а не на «а».):
a eq to a? j is 22 i is 0
scan_count: -1 count: 1
m eq to a? j is 22 i is 1
m eq to m? j is 21 i is 1
scan_count: 0 count: 2
a eq to a? j is 22 i is 2
scan_count: 1 count: 3
a eq to a
в порядке и соответствует ... m находится на следующей итерации, но когда вы переходите к следующему «a», вы находите оригинальное «a» в конце панамы ...
В качестве примечания: поскольку вы каждый раз начинаете с самого конца, это будет ужасно неэффективно O(n^2)
с учетом достаточно большой строки ...
Обязательное решение:
$word = "amanaplana canalpan ama";
$j = strlen ($word)-1;
$pal = true;
for ($i = 0; $i < strlen($word)/2; ++$i, --$j) {
// skip spaces
while ($word[$i] === " ") {$i++;}
while ($word[$j] === " ") {$j--;}
echo "$word[$i] eq $word[$j]?\n";
if ($word[$i] !== $word[$j]) {
$pal = false;
break;
}
}
if ($pal) print "yes"; else print "no";