Делаем умный объект из многомерного массива
С объектами работать удобнее из за их синтаксиса и потому что в них можно обрабатывать несуществующие свойства, если они запрашиваются при этом не получая никаких PHP нотисов.
Функция ниже превращает переданный массив (любого уровня вложенности) в объект:
/** * Recursively converts all array data to an objects. * * @version 3.1 * @php 7.0 * @author Kama (wp-kama.ru) * * @param array $data * * @return object */ function array_to_object( $data ){ if( ! is_array( $data ) ) return $data; foreach( $data as & $val ){ $val = array_to_object( $val ); } unset( $val ); // if there is no numbers in array_keys // !important - after foreach - bug in php 7.0 if( ! $is_associative_array = ( $data && ( array_keys($data) !== range( 0, count($data) - 1 ) ) ) ) return $data; return new class( $data ) implements ArrayAccess { public function __construct( $data ){ foreach( $data as $key => $val ){ $this->$key = $val; } } public function __get( $name ){ return $this->$name ?? null; } public function offsetGet( $name ){ return $this->$name ?? null; } public function offsetSet( $name, $val ){ return $this->$name = $val; } public function offsetExists( $name ){ return isset( $this->$name ); } public function offsetUnset( $name ){ unset( $this->$name ); } }; }
Пример использования:
$arr = [ 'aaa', 'foo' => 'bar', 'arr2' => [ 1, 2, 3 ], 'arr3' => [ 'somekey' => 123 ], '4arr' => [ 'key' => [ 'фыв' => ['1234'=>'1234'] ] ], ]; $obj = array_to_object( $arr ); print_r( $obj ); /* class@anonymous Object ( [0] => aaa [foo] => bar [arr2] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [arr3] => class@anonymous Object ( [somekey] => 123 ) [4arr] => class@anonymous Object ( [key] => class@anonymous Object ( [фыв] => class@anonymous Object ( [1234] => 1234 ) ) ) ) */
Получаем отдельные данные из объекта (обратите внимание что значения можно получать как элементы массива или объекта):
print_r( $obj->arr2 ); print_r( $obj['arr2'] ); /* Array ( [0] => 1 [1] => 2 [2] => 3 ) */ var_dump( $obj->arr3->somekey ); // int(123) var_dump( $obj->arr3['somekey'] ); // int(123) var_dump( $obj['arr3']['somekey'] ); // int(123) var_dump( $obj->not_exists ); // NULL var_dump( $obj['not_exists'] ); // NULL