Недавно мной был обнаружен баг при создании простой страницы: в различных браузерах проход по отсортированному массиву производится по разному( к слову - в FF проход идет нормальный, в Opera и Chrome - все идет не по плану).
Суть заключается в следующем:
на стороне сервера создается массив, сортируется по значениям в алфавитном порядке и передается во view:
$data = array();
....
asort($data, SORT_STRING);
$this->view->data = Zend_Json_Encoder::encode($data); // передаем во view наш массив, закодированный в json.
Во view обработка следующая (происходит заполнение тэга select при помощи js):
var data = data ?>;
for(t in data)
{
el.attr('value', t);
$('#object_id').append(el);
}
В данном случае, не смотря на то, что массив JS заполнен отсортированными по значениям - не ключам - данными, браузеры проходят по массиву как хотят. Решением данной проблемы стал следующий костыль:
при заполнении массива на стороне сервера необходимо выравнивать длину ключей( в моем случае ключи были целочисленными) при помощи функции vsprintf, в результате чего происходит заполнение недостоющих символов пробелами( при обработке POST запроса - лишние пробелы собственоручно удаляются) :
$data = array();
....
asort($data, SORT_STRING);
$result = array();
foreach($data as $k => &$v)
{
$result[vsprintf("%10s", $k)] = $v;
}
$data = $result;
$this->view->data = Zend_Json_Encoder::encode($data);
В качестве альтернативы ф-ции vsprintf можно использовать ф-цию str_pad.
Суть заключается в следующем:
на стороне сервера создается массив, сортируется по значениям в алфавитном порядке и передается во view:
$data = array();
....
asort($data, SORT_STRING);
$this->view->data = Zend_Json_Encoder::encode($data); // передаем во view наш массив, закодированный в json.
Во view обработка следующая (происходит заполнение тэга select при помощи js):
var data = data ?>;
for(t in data)
{
el = $("");
el.attr('label', data[t]);el.attr('value', t);
$('#object_id').append(el);
}
В данном случае, не смотря на то, что массив JS заполнен отсортированными по значениям - не ключам - данными, браузеры проходят по массиву как хотят. Решением данной проблемы стал следующий костыль:
при заполнении массива на стороне сервера необходимо выравнивать длину ключей( в моем случае ключи были целочисленными) при помощи функции vsprintf, в результате чего происходит заполнение недостоющих символов пробелами( при обработке POST запроса - лишние пробелы собственоручно удаляются) :
$data = array();
....
asort($data, SORT_STRING);
$result = array();
foreach($data as $k => &$v)
{
$result[vsprintf("%10s", $k)] = $v;
}
$data = $result;
$this->view->data = Zend_Json_Encoder::encode($data);
В качестве альтернативы ф-ции vsprintf можно использовать ф-цию str_pad.
Комментариев нет:
Отправить комментарий