Глики при сложении массивов на хосте

Статус
В этой теме нельзя размещать новые ответы.

Igor aka TiGR

Новичок
Глюки при сложении массивов на хосте

Имеется следующий код:
PHP:
$args  = func_get_args();
$field = $args + array_fill(0,7,null);
По идее, срабатывать всё должно правильно - массив должен увеличиваться до 8 элементов, отсутсвующие элементы заполняются null.

Всё работает, уже не один год. Так же, всё работало на хосте (valuehost). Но, уже недели две или три как скрипты перестали работать. Покопался - оказалось, сложение происходит следующим образом - просто-напросто, все значения становятся равным null. Причём, такое поведение только на хосте, на локалке всё путём.

Что бы это могло значить?

Версии php - одинаковые - php 4.3.10.

Почему спрашиваю - такое поведение вроде бы принципиально невозможно?
 

Igor aka TiGR

Новичок
Мдя... Я же говорю - неправильное поведение. Дело тут не в дебаге, я уже всё многократно проверил. Сообщения об ошибках включены (E_ALL), а толку-то? Ни одной ошибки.

Повторяю ещё раз: Этот код я уже давно не менял, он работал и работал. А потом перестал. Везде, по всему проекту. Разом. В то время как на других серверах продолжает прекрасно пахать.

Меня интересует, не сталкивался ли кто-нибудь с подобным поведением php (особенно те, кто хостится на valuehost).
 

SiMM

Новичок
hint для тех, кто не умеет читать FAQ, повторять не буду.
PHP:
function tst(){
  $args  = func_get_args();
  return $args + array_fill(0,7,null);
}
var_dump(tst());
-~{}~ 29.01.05 17:55:

> Сообщения об ошибках включены (E_ALL), а толку-то? Ни одной ошибки.
Это ещё не значит, что они выводятся на экран и их нет в логах.
 

Igor aka TiGR

Новичок
Ежели вам нужны дампы, пожалуйста. Для генерации использовался следующий код:
PHP:
function test() {
    $args=func_get_args();
    var_dump($args);
    return $args + array_fill(0,7,null);
}
var_dump(test("one", "two", "three"));
На локалке был следующий результат:
Код:
array(3) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
  [2]=>
  string(5) "three"
}
array(7) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
  [2]=>
  string(5) "three"
  [3]=>
  NULL
  [4]=>
  NULL
  [5]=>
  NULL
  [6]=>
  NULL
}
На сервере вот что:
Код:
array(3) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
  [2]=>
  string(5) "three"
}
array(7) {
  [0]=>
  NULL
  [1]=>
  NULL
  [2]=>
  NULL
  [3]=>
  NULL
  [4]=>
  NULL
  [5]=>
  NULL
  [6]=>
  NULL
}
> > Сообщения об ошибках включены (E_ALL), а толку-то? Ни одной ошибки.
> Это ещё не значит, что они выводятся на экран и их нет в логах.

Проект о котором я говорю, находится в стадии финальной отладки, так что все ошибки там выводятся на экран.

Позвольте встречный hint: я программирую уже 13 лет, из них 4 года - на php.

-~{}~ 29.01.05 23:32:

P.S: Прежде чем обращатся сюда, я несколько раз проверил доку по php (включая комментарии пользователей), искал по FAQ и форуму. И если бы вопрос решался просто - этой темы здесь бы не было.
 

SiMM

Новичок
> И если бы вопрос решался просто - этой темы здесь бы не было.
Если бы вы сразу привели тестовые дампы - ссылкой на FAQ вас бы не ткнули ;) Что касается мана, то в нём чётко сказано
http://php.net/manual/ru/language.operators.array
Оператор + присоединяет правый массив к массиву, размещенному слева НЕ перезаписывая элементы с дублирующимися ключами.
т.е. всё должно работать. В принципе, если речь о том, чтобы решить проблему, а не разобраться - то ни что не мешает вам переписать функцию так, чтобы она работала требуемым образом, не используя сомнительного '+' (например, используя [m]array_merge[/m] или же готовя массив циклом). Ещё может иметь смысл сходить на http://bugs.php.net/
 

Igor aka TiGR

Новичок
Спасибо. Это на самом деле баг. Причём, похоже, дело в zend optimizer'e.
http://bugs.php.net/bug.php?id=30535

-~{}~ 30.01.05 18:52:

array_merge ведёт себя несколько иначе, чем +. Но, для решения подойдёт. Вот я и думаю - а оператор-то это вообще стоит использовать?..

Решение такое:
PHP:
array_merge($args, array_fill(0,7-count($args),null));
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху