WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Получай пассивный доход от сайта с помощью браузерных PUSH уведомлений

Делаем умный объект из многомерного массива

С объектами работать удобнее из за их синтаксиса и потому что в них можно обрабатывать несуществующие свойства, если они запрашиваются при этом не получая никаких 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
Комментариев нет
    Войти