2013-09-23 4 views
2

Ive получил этот фрагмент кода, ниже которого работает отлично. Я профилировал его, и бит кода используется много раз, поэтому я хочу попытаться выяснить, как написать его таким образом, который будет работать лучше, чем текущий способ его написания.Более быстрый способ делать objectToArray

Есть ли более эффективный способ написать это?

function objectToArray($d) { 
    if (is_object($d)) { 
     // Gets the properties of the given object 
     // with get_object_vars function 
     $d = get_object_vars($d); 
    } 

    if (is_array($d)) { 
     // Return array converted to object Using __FUNCTION__ (Magic constant) for recursive call 
     return array_map(__FUNCTION__, $d); 
    } 
    else { 
     // Return array 
     return $d; 
    } 
} 
+1

Преобразование в формат JSON, а затем преобразовать ассоциативный массив? – MisterBla

ответ

1

Вы могли бы реализовать toArray() метод к классу, который должен быть преобразован:

например

class foo 
{ 
    protected $property1; 
    protected $property2; 

    public function __toArray() 
    { 
    return array(
     'property1' => $this->property1, 
     'property2' => $this->property2 
    ); 
    } 
} 

Имея доступ к защищенным свойствам и имеющие все преобразования, инкапсулированный в классе, на мой взгляд, лучший способ.

Update

Одна вещь, чтобы отметить, что функция get_object_vars() будет возвращать только доступные свойства публично - Возможно, не то, что вы после этого.

Если выше тоже руководство о задаче точный путь из-за пределов класса будет использовать PHP (SPL), построенный в ReflectionClass:

$values = array(); 
$reflectionClass = new \ReflectionClass($object); 
foreach($reflectionClass->getProperties() as $property) { 
    $values[$property->getName()] = $property->getValue($object); 
} 
var_dump($values); 
+0

Спасибо AlexP, может быть, он может быть установлен в instad текущего фрагмента? –

+0

@ChrisEdington Взгляните на мое обновление. Любой вариант будет работать, это зависит только от области, в которой вы пытаетесь получить доступ к переменным, и от возможности добавления новых методов в класс. – AlexP

+0

Может ли он сохранить одну и ту же структуру функций и имя и просто переработать код внутри? Преобразованный объект является SOAP-ответом, если это помогает? .. –

0

зависит, какой тип объекта это, многие стандартные объекты PHP имеют методы встроенный конвертировать их

для результатов примера Mysqli могут быть преобразованы как этот

$resultArray = $result->fetch_array(MYSQLI_ASSOC); 

, если его собственный класс, объект, который вы могли бы рассмотреть вопрос о внедрении метода в этом классе для этой цели в качестве AlexP мотивационные

+0

Может ли он поддерживать одну и ту же структуру функций и имя и просто переделывать код внутри? Преобразованный объект является SOAP-ответом, если это помогает? .. –

+0

Не знакомы с SOAP специально, но быстрый google позорил его XML, поэтому вы можете использовать XML-функции PHP '$ soapResponce = simplexml_load_file (" soapResponce.xml ") ; $ soapArray = unserialize (serialize (json_decode (json_encode ((array) $ soapResponce), 1))); print_r ($ xml_array); ' кредит: http://stackoverflow.com/questions/12148662/xml-to-array-php – Philippe

0

Законченное происходит с:

function objectToArray($d) { 
$d = (object) $d; 
return $d; 
} 
function arrayToObject($d) { 
$d = (array) $d; 
return $d; 
} 
0

Как AlexP сказал, что вы можете реализовать метод __toArray() , В качестве альтернативы ReflexionClass (который является сложным и дорогостоящим), используя object iteration properties, вы можете перебирать $this, как следовать

class Foo 
{ 
    protected $var1; 
    protected $var2; 

    public function __toArray() 
    { 
    $result = array(); 
    foreach ($this as $key => $value) { 
     $result[$key] = $value; 
    } 
    return $result; 
    } 
} 

Это также итерация объекта атрибутов не определен в классе: Е.Г.

$foo = new Foo; 
$foo->var3 = 'asdf'; 
var_dump($foo->__toArray());) 

См пример http://3v4l.org/OnVkf

Смежные вопросы