Всем приветы. не буду полностью описывать алгоритм работы - это очень надолго, наткнулся на интересную тему. есть массив, вот: var_dump:: array(2) { ["1"]=> bool(true) ["2"]=> bool(true) } print_r:: Array ( [1] => 1 [2] => 1 ) А обратиться к нему - не могу, пробовал: var_dump:: $array[1] -> NULL var_dump:: $array["1"] -> NULL var_dump:: $array['1'] -> NULL var_dump:: $array[(int)1] -> NULL var_dump:: $array[(string)1] -> NULL В чем прикол то? ))))
$checked=(array)getItemSQLList($product[0]['sqlextend'],$item['var'],'val_checkbox'); print_r($checked); внутри [iditem]=>true\false, список чеканутых чекбоксов, объект переведенный в массив, если не конвертить то работает нормально
я упростил для размещения на форуме --- Добавлено --- т.е. имеется ввиду var_dump($checked[1]) - выдаст NULL
a:2:{s:1:"1";b:1;s:1:"2";b:1;} --- Добавлено --- фишка в том что изначально это JSON - переданный из ajax в php - сохраненный в бд, затем "достатый", но как известно (array)json_decode - почему то оставляет вложенные объекты как объекты, вот функция возвращает мне этот объект, но я его сразу конверчу в массив - (array)getItemSQLList - и ничего не работает) если не конвертить на последнем шаге, а просто юзать как $checked->1 - то работает, только эта 1 - находится в переменной, т.е. в цикле где то там в недрах выглядит так - if ($checked->$current['id']==true) { выдать чеканутый бокс } else { пустой } --- Добавлено --- Стало еще интереснее, на разных версиях работат тоже по разному))) на 5.3.3 - работает только через массивы, 5.3.13 - работает только через объекты --- Добавлено --- Походу выход только один, обновить до 5.3.3
Поток сознания. Код дай, который ведет себя по-разному. --- Добавлено --- PS: использовать 5.3.x для разработки _нельзя_
Это как это ? вот массив "достатый" из БД - a:11:{s:9:"trademark";s:1:"2";s:8:"checkbox";O:8:"stdClass":2:{s:1:"1";b:1;s:1:"2";b:1;}s:8:"name_dop";s:4:"null";s:7:"krcolor";s:4:"null";s:8:"FullDesc";s:4:"null";s:4:"Desc";s:4:"null";s:11:"technologie";s:4:"null";s:11:"processtype";s:4:"null";s:8:"selector";s:4:"null";s:10:"Badproduct";s:4:"null";s:6:"Hidden";b:0;} из него достается объект checkbox с помощью поиска нужной на текущий момент переменной и в спике свойств товара есть чекбоксы $options - список возможных боксов для текущкго товара грузится из другой таблицы, и соответственно проверяем какие из чекбоксов чекнуты Вариант смассивом: Код (Text): $checked=(array)getItemSQLList($product[0]['sqlextend'],$item['var'],'val_checkbox'); Код (Text): foreach ($options as $option) { if (isset($checked[$option['id']]) && $checked[$option['id']]==1) { $block.="<label><input type=checkbox checked value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>"; } else { $block.="<label><input type=checkbox value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>"; } } Вариант с объектом Код (Text): $checked=getItemSQLList($product[0]['sqlextend'],$item['var'],'val_checkbox'); Код (Text): foreach ($options as $option) { if (isset($checked->$option['id']) && $checked->$option['id']==1) { $block.="<label><input type=checkbox checked value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>"; } else { $block.="<label><input type=checkbox value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>"; } }
PHP: $foo = 'a:11:{s:9:"trademark";s:1:"2";s:8:"checkbox";O:8:"stdClass":2:{s:1:"1";b:1;s:1:"2";b:1;}s:8:"name_dop";s:4:"null";s:7:"krcolor";s:4:"null";s:8:"FullDesc";s:4:"null";s:4:"Desc";s:4:"null";s:11:"technologie";s:4:"null";s:11:"processtype";s:4:"null";s:8:"selector";s:4:"null";s:10:"Badproduct";s:4:"null";s:6:"Hidden";b:0;}'; $bar = unserialize($foo); $var = 1; echo $bar['checkbox']->$var; Дает 1 Все работает. --- Добавлено --- PHP 5.3 не поддерживается уже почти 2 года. Текущая версия 5.6. Хотя новый проект нынче имеет смысл начинать на 7.0. У них не такие большие различия в обратной совместимости, что бы держаться на старые версии
Угу, понял в чем твоя проблема. Числовые ключи в PHP всегда приводятся к integer. Т.е. $a['1'] - всегда переписывается внутри на $a[1]. Например Код (Text): php > $arr = [ "1" => true, "2" => true ]; php > var_export($arr); array ( 1 => true, 2 => true, ) # ключи - без кавычек, т.е. integer Исключение - конвертация из объекта. Если у объекта было свойство строковое '1' - то строковое оно и останется в массиве. Код (Text): php > $baz = new StdClass; php > $baz->{"1"} = true; php > $baz->{"2"} = true; php > var_export((array)$baz); array ( '1' => true, '2' => true, ) # ключи в кавычках, т.е. строковые А так, как обращения к ключу '1' переписываются в integer - то до такого строкового ключа не добраться. Как быстрый хак, можно написать что-то вроде $baz = array_combine(array_keys($baz), array_values($baz)) - т.е. создать новый массив из старого. При создании пхп конвертнет строковые числовые ключи в целое. Код (Text): php > var_export(array_combine(array_keys($baz), array_values($baz))); array ( 1 => true, 2 => true, ) Насчет другого поведения в 5.3.3 нужно погуглить.
Интересная тема получилась, спасибо - не додумался бы.. в итоге у меня на дебажной машине ща работает через объект, а на рабочем хосте - на массиве - и как то это не дастиш фантастиш)
@MiksIr забавно. @V2oD2o у функции json_decode() есть второй аргумент, с его помощью устанавливается тип возвращаемого значения - массив. Тогда возвращается корректный массив. Еще можно получить свойства любого объекта в корректный массив с помощью функции get_object_vars().
Хм, странно, но поведение иное только в 4-й версии https://3v4l.org/pJ8IO https://3v4l.org/ovQjL Начиная с 5-й версии поведение одинаковое.
Актуальная версия: PHP 7.0.6 Released Какие нах 5.3.3. Ужас. Давно пора избавиться от этого куска дерьма. Уже забыл даже, что это такое.
Если у клиента сайт написан давно(под 5.3 например) и работает без проблем - выполняя свою функцию и принося доход, то логика клиента проста - зачем чтото постоянно переписывать в погоне за новой версией? Это его право. он платит. В этом нет ничего необычного. Новое конечно нужно начинать на максимально свежей версии, ну а поддержка старых проектов может требовать и старых версий.
Поломать могут и сайт написанный на последней семерке. если это комуто будет нужно. В любом случае, если клиент нехочет вкладываться в миграцию на новое ПО - это его дело и его риски. Это очень распространенное явление. Никакого кошмара в этом нет.