array_search в комплекте с array_merge

yug

Новичок
array_search в комплекте с array_merge

Господа умники,

Задача для школьника, выдает странный результат. Комментировать не буду, т.к
все тривиально. Вопрос касается array_merge.
Прокомментируйте пожалуйста РАЗНЫЙ результат использования алфавитов 1 и 2.

PHP:
<?php

$niddle = '5*rYnB3t;?';

// алфавит1 - все работает
$alphabet1  = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                    '1','2','3','4','5','6','7','8','9','0');
                    
// алфавит2 - по идее the same shit чтои алфавит1(?) , но результат отличается
$alphabet2 = array_merge( range('0','9'), range('a','z'), range('A','Z') );
                          
$length = strlen($niddle); 
                          
for ($i=0; $i < $length; $i++){
    
    $key1 = array_search($niddle[$i], $alphabet1);    // add to watch list
    $key2 = array_search($niddle[$i], $alphabet2);    // add to watch list
    if ($key1 == 0){
         echo "Char <b>{$niddle[$i]}</b> is not from alphabet1<br />";     
    } 
    if ($key2 == 0){
         echo "Char <b>{$niddle[$i]}</b> is not from alphabet2<br />";     
    } 
}

?>

результат выполнения:

Char * is not from alphabet1
Char * is not from alphabet2
Char r is not from alphabet2
Char Y is not from alphabet2
Char n is not from alphabet2
Char B is not from alphabet2
Char t is not from alphabet2
Char ; is not from alphabet1
Char ; is not from alphabet2
Char ? is not from alphabet1
Char ? is not from alphabet2

in_array пробовал, работает также.

Версия php у меня:
PHP Version 5.1.2
 

AmdY

Пью пиво
Команда форума
бред, у меня php4 всё нормально, попробуй продебажить.
 

john.brown

просто кулибин
Действительно любопытно - на пхп4 все ок, на пхп5 - бред :( Хотя массив правильный вроде...
 

AmdY

Пью пиво
Команда форума
нород с 5-м попробуйте, чтоб массивы дыли действительно одинаковы
$alphabet2 = array_merge( range('a','z'), range('A','Z'), range('0','9') );
 

StUV

Rotaredom
судя по всему - баг в array_search точно есть (php 5.2.0)
так как
PHP:
...
var_dump(array_search('Y', $alphabet2));
for ($i = 0; $i < count($alphabet2); $i++)
{
        if ('Y' === $alphabet2[$i])
        {
                echo "exists\n";
                exit;
        }
}
 

Dovg

Продвинутый новичок
попробуйте sort()
они еще и сортируются по-разному (PHP5)
 

yug

Новичок
оказывается это проблема уже была зафиксирована на php.net, хотя по другому немного, но смысл примерно тот же:
http://bugs.php.net/bug.php?id=40247

-~{}~ 09.02.07 16:56:

>
to AmdY:
>нород с 5-м попробуйте, чтоб массивы дыли действительно одинаковы
>$alphabet2 = array_merge( range('a','z'), range('A','Z'), range('0','9') );
кстати и вправду так работает. и не бредово, результат верный

походу ответ я нашел, хотя можно сказать что это баг php v5.1.2
(может в 5.2 это исправили)

видимо дело в то что php воспринимает 0 ... 9 в начале массива как long int.
и во время поиска воспринимает остальной алфавит тоже как long int.
нужно жестко определять тип данных в третьем пераметрe array_search
RTFM

решение проблемы (thanx to Amdy):
PHP:
$alphabet2 =  array_merge(  range('a','z'), range('A','Z'), range('0','9'));
тоесть алфавит должен наинаться с букв - а вот это действительно бред
 
Сверху