2014-01-18 6 views
1

Может кто-нибудь объяснить мне, почему этот кодНеобычный выход PHP

$ar = [ 
    'item' => '−2', 
]; 

for ($i = 1; $i >= -2; $i--) { 
    foreach ($ar as $x => $y) { 
    if ($y == $i) { 
     echo $y . ' == ' . $i . "\n"; 
    } 
    } 
} 

Производит

−2 == 0 
+0

Вы уверены, что это ваш выход? Я просто запускаю тот же самый скрипт, и я получаю -2 == -2. Я копирую этот код. –

+0

@MarioSegura да, я уверен. Какую версию PHP вы используете? – Vladimir

+1

@MarioSegura невредим. Оказалось, что знак минуса на моем конце был особым символом UTF8. – Vladimir

ответ

3

«-» в вашем массиве - это символ Unicode «MINUS SIGN» (U + 2212), который PHP не считает принадлежащим в числовой строке. (Он распознает только U + 002D, HYPHEN-MINUS, отчасти потому, что он не поддерживает UTF-8 на этом уровне, а на фондовый PHP все строки: байт строки.) Поскольку это не числовое значение, а строка doesn «т даже начало с числовыми данными, его числовое значение равно 0.

Если удалить тире Unicode и ввести в тире вместо (который должен ввести ASCII один), сценарий должен работать, как ожидалось.

+0

Спасибо. Это была проблема. – Vladimir

4

Вы получаете тот результат, потому что -2 это строка - PHP не выполняет числовое сравнение. Измените == на ===, чтобы использовать строгое сравнение, которое будет возвращать только true, если значения и их типы эквивалентны.

+0

+1 за ваш ответ, но до сих пор не знаю, почему '-2 == 0', а не' -2 == 1' –

+0

@mansoulx взгляните на это: http://www.php.net/manual /en/types.comparisons.php –

+0

да, да. Я не знал. Спасибо –

0

После некоторых исследований я понимаю, как это работает. Во-первых, прочитайте это из doc:

The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero).

'-2' Так считается 0 из - (начальная часть), так что если заявление будет введен только тогда, когда i == 0 означает -2 == 0. А затем эхо $y - $i.

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