PHP установил присвоенную переменную в неопределенное - она ​​остается прежней? - PullRequest
0 голосов
/ 22 марта 2011

У меня есть вопрос о поведении, которое я только что отлаживал, в частности, что происходит, если переменной, которая уже установлена, присваивается неопределенное значение. Я просто хочу проверить, правильно ли я понимаю, что случилось. Если для переменной уже установлено значение, и вы пытаетесь установить для нее что-то неопределенное, она останется со своим старым значением?

В частности, у меня был некоторый PHP-код, который выглядел примерно так: предположим, что $ string - это строка из 1 и 2.

$array = array(1 => 'foo', 2 => 'bar');
for($count=0;$count<len($string);$count++)
{
    $newvar = $array[$string[$count]];
    if(!empty($newvar))
    {
       switch($newvar)
       {
             case 'foo':
                    // blah blah break;
             case 'bar':
                    // blah blah break;
       }
    }
}

Теперь мой код должен был установить $ string как что-то вроде "12212", но с моей стороны ошибка отправляла ему что-то с лишними пробелами в конце - "12212". Это вызвало некоторое аберрантное поведение, и я думаю, что произошло следующее: когда $ count = 5, $ string [5] не определено, поэтому $ array [$ string [5]] не определено, а $ newvar остается равным 2. Таким образом, мой оператор if (! empty не выполняет свою работу, а case 'bar' встречается чаще, чем следовало бы. Похоже, все это происходит так?

Конечно, обрезка $ string решила мою проблему, но я хочу убедиться, что понимаю, что происходит не так. Извиняюсь, если это глупый вопрос - я просто любитель здесь ...

Редактировать: вот фактический код. Предполагается, что $ upstr представляет собой строку цифр.

           $len = strlen($upstr);
           $cost=0;
           $upnames = array(4=>"man", 2=>"raw", 1=>"food", 3=>"fuel",5=>"tech");
           for($strloop=0;$strloop<$len; $strloop++)
           {
                 $number = $upstr[$strloop];
                 if(! empty($number))
                 {
                     $name = $upnames[$number];
                     $cost+= mysql_result($result1,0,$name) +1;
                     if(mysql_result($result2,0,$name."up")==1)
                     {
                         $cost+=100;
                     }
                 }
           }

Что произошло, когда у $ upstr в конце были лишние пробелы, так это то, что я увидел ошибку mysql, которая не нашла столбец «вверх» в $ result2. Поэтому он пытался запустить этот блок кода в операторе if () с пустым значением $ name или значением NULL или чем-то еще. И если бы я намеренно добавил 3 или 4 лишних пробела, я увидел бы столько ошибок mysql.

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

Боюсь, что определение переменной $ array неверно в вашем примере кода, оно должно выглядеть следующим образом:

$ array = array (1 => 'foo', 2 => 'bar');

Если вы установите $ newvar в неопределенный элемент массива $ (например, 3), то для $ newvar будет установлено значение NULL.

0 голосов
/ 22 марта 2011

Хорошо, я выяснил, что стало причиной поведения, которое я увидел. Строки '' и '' ведут себя по-разному в empty (). Один из них считается пустым, а другой нет, что меня смущало. Большое спасибо за помощь.

0 голосов
/ 22 марта 2011

Используйте array_key_exists($array, $string[$count]), чтобы проверить, имеет ли ваш массив значение для вашего ключа.

...