Getting values from arrays

Василий М.

Новичок
PHP:
        public static function get($array, $key, $default = null) {
            return isset($array[$key]) ? $array[$key] : $default;
        }

// ...

    return Arr::get($_POST, $key);
мне одному кажется, что это дико не красиво?
У php есть __set/__get/__call и прочие вкусности типа array acess, array object и т.п.
Можно создать обертку для массивов и писать более элегантно
PHP:
$a = $this->getPost()->field_name ?: 'default';
 

Вурдалак

Продвинутый новичок
Только это не Kohana 3 во всяком случае. Это что вообще? Кусками похоже оттуда, но не оно.
 

Adelf

Administrator
Команда форума
флоппик
ну я про кохановскую и говорил в общем. А Вурдалак просто отметил сходство.
 

Adelf

Administrator
Команда форума
Василий М.
default value. Ты всегда уверен, что в массиве есть нужные данные?
 

Вурдалак

Продвинутый новичок
Василий М., тебе придётся выбрасывать exception, если какого-то ключа нет, чтобы избежать fatal error.
 

Василий М.

Новичок
Adelf
в чем сложность сделать isset и вернуть null если значения нет?

Вурдалак
если ключа нет - отдавать null, если нет ключа в цепочке - создавать объект подобной структуры и он же отдаст null
 

Adelf

Administrator
Команда форума
$this->getPost()->some->deep->key

Если deep будет null у тебя будет ошибка.
 

Adelf

Administrator
Команда форума
А как мы в __get будем знать в цепочке у нас вызывается или нет?
 

AmdY

Пью пиво
Команда форума
Adelf
он предлагает ввести NullObject, который на __get возвращает себя же, а __toString пустую строку. плюсов особых не видно, зато оопэшно :).
вроде создатель java назвал такую конструкцию ошибкой на миллиард.
 

Adelf

Administrator
Команда форума
AmdY
Да я догадался. Но потом придется сравнивать с пустой строкой. Причем пустой строкой может быть и искомое значение. Это не только не оопшно, но вообще за гранью морали. Default значение может быть 0, null, -1 ну и пустая строка. Тут Arr::get сильно гибче.
В итоге, никаких преимуществ по сравнению Arr::get, кроме чуть лучшей читаемости.

Awilum
Нашу дискуссию мы скоро перенесем в другую тему. Дабы не обременять эту ненужным смыслом.
 

Василий М.

Новичок
то что я делал: http://krugozor.svn.sourceforge.net/viewvc/krugozor/Krugozor/Cover/

PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);

// DOC_ROOT для тестирования из www или из консоли.
define('DOC_ROOT', !empty($_SERVER['DOCUMENT_ROOT']) ? dirname($_SERVER['DOCUMENT_ROOT']) : dirname(dirname(dirname(dirname(__FILE__)))));

require(DOC_ROOT . '/lib/classes/Cover/Array.php');

// Тесты возможностей класса Cover_Array.

echo "> Content var \$array type of Cover_Array:\n";
$array = new Cover_Array( array('foo', 12345, 'element' => array('key' => 'value', 'key2' => 'value2')) );
print_r($array);
echo "\n\n";

echo "> echo \$array->item(0);\n";
echo $array->item(0); // foo
echo "\n\n";

echo "> echo \$array->element->key;\n";
echo $array->element->key; // value
echo "\n\n";

echo "> echo \$array['element']['key'];\n";
echo $array['element']['key']; // value
echo "\n\n";

echo "> echo \$array->element->count();\n";
echo $array->element->count(); // 2
echo "\n\n";

echo "> echo \$array->element->append('Hellow, PHP!')->item(0);\n";
echo $array->element->append('Hellow, PHP!')->item(0); // Hellow, PHP!
echo "\n\n";

echo "> echo \$array->element->count();\n";
echo $array->element->count(); // 3
echo "\n\n";

echo "> print_r(\$array->getDataAsArray());\n";
print_r($array->getDataAsArray()); // получаем обычный массив
echo "\n\n";

echo "> foreach by \$array->element:\n";
foreach ($array->element as $key => $value) {
    echo "$key => $value \n";
}
echo "\n\n";

echo "> \$array->is_array = array(1, 2, 3);\n";
echo "> print_r(\$array->is_array);\n";
$array->is_array = array(1, 2, 3);
print_r($array->is_array); // Cover_Array Object ( [data:protected] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) 
echo "\n";

echo "> var_dump(\$array->non_exists_prop);\n";
var_dump($array->non_exists_prop); // NULL, никаких Notice
echo "\n";

echo "> print_r(\$array['non_exists_prop']);\n";
print_r($array['non_exists_prop']); // Cover_Array Object
echo "\n\n";

echo "> \$array['non_exists_prop']['non_exists_prop']['property'] = true;\n";
echo "> print_r(\$array['non_exists_prop']);\n";
$array['non_exists_prop']['non_exists_prop']['property'] = true;
print_r($array['non_exists_prop']); // создалась цепочка вложенных массивов 

echo "> echo \$array['non_exists_prop']['non_exists_prop'];\n";
echo $array['non_exists_prop']['non_exists_prop']; // string ''
echo "\n\n";
output:

Код:
vasiliy.t-www (list-interval) ~/sites/newmvideo $ php lib/classes/Cover/test.php
> Content var $array type of Cover_Array:
Cover_Array Object
(
    [data:protected] => Array
        (
            [0] => foo
            [1] => 12345
            [element] => Cover_Array Object
                (
                    [data:protected] => Array
                        (
                            [key] => value
                            [key2] => value2
                        )

                )

        )

)


> echo $array->item(0);
foo

> echo $array->element->key;
value

> echo $array['element']['key'];
value

> echo $array->element->count();
2

> echo $array->element->append('Hellow, PHP!')->item(0);
Hellow, PHP!

> echo $array->element->count();
3

> print_r($array->getDataAsArray());
Array
(
    [0] => foo
    [1] => 12345
    [element] => Array
        (
            [key] => value
            [key2] => value2
            [0] => Hellow, PHP!
        )

)


> foreach by $array->element:
key => value
key2 => value2
0 => Hellow, PHP!


> $array->is_array = array(1, 2, 3);
> print_r($array->is_array);
Cover_Array Object
(
    [data:protected] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)

> var_dump($array->non_exists_prop);
NULL

> print_r($array['non_exists_prop']);
Cover_Array Object
(
    [data:protected] => Array
        (
        )

)


> $array['non_exists_prop']['non_exists_prop']['property'] = true;
> print_r($array['non_exists_prop']);
Cover_Array Object
(
    [data:protected] => Array
        (
            [non_exists_prop] => Cover_Array Object
                (
                    [data:protected] => Array
                        (
                            [property] => 1
                        )

                )

        )

)

> echo $array['non_exists_prop']['non_exists_prop'];
 
Сверху