505 Stimmen

Wie konvertiert man ein Array in ein Objekt in PHP?

Wie kann ich ein Array wie dieses in ein Objekt umwandeln?

[128] => Array
    (
        [status] => "Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution."
    )

[129] => Array
    (
        [status] => "The other day at work, I had some spare time"
    )

20voto

zombat Punkte 89911

Soweit ich weiß, gibt es dafür keine eingebaute Methode, aber es ist so einfach wie eine einfache Schleife:

    $obj= new stdClass();

    foreach ($array as $k=> $v) {
        $obj->{$k} = $v;
    }

Sie können das erweitern, wenn Sie es brauchen, um Ihr Objekt rekursiv aufzubauen.

11voto

Ankit Vishwakarma Punkte 1430

Etwas komplizierte, aber leicht zu erweiternde Technik:

Angenommen, Sie haben ein Array

$a = [
     'name' => 'ankit',
     'age' => '33',
     'dob' => '1984-04-12'
];

Angenommen, Sie haben eine Person-Klasse, die mehr oder weniger Attribute aus diesem Array haben kann. zum Beispiel

class Person 
{
    private $name;
    private $dob;
    private $age;
    private $company;
    private $city;
}

Wenn Sie Ihr Array trotzdem in ein Personenobjekt umwandeln wollen. Sie können die Klasse ArrayIterator verwenden.

$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.

Jetzt haben Sie ein Iterator-Objekt.

Erstellen Sie eine Klasse, die die Klasse FilterIterator erweitert; dort müssen Sie die abstrakte Methode accept definieren. Folgen Sie dem Beispiel

class PersonIterator extends \FilterIterator
{
    public function accept()
    {
        return property_exists('Person', parent::current());
    }
}

Die obige Impelmentierung bindet die Eigenschaft nur, wenn sie in der Klasse vorhanden ist.

Hinzufügen einer weiteren Methode in der Klasse PersonIterator

public function getObject(Person $object)
{
        foreach ($this as $key => $value)
        {
            $object->{'set' . underscoreToCamelCase($key)}($value);
        }
        return $object;
}

Stellen Sie sicher, dass Sie Mutatoren in Ihrer Klasse definiert haben. Jetzt können Sie diese Funktionen dort aufrufen, wo Sie ein Objekt erstellen möchten.

$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);

$personIterator->getObject(); // this will return your Person Object.

11voto

Nezzy Punkte 191

Eigentlich, wenn Sie dies mit mehrdimensionalen Arrays verwenden möchten, würden Sie einige Rekursion verwenden wollen.

static public function array_to_object(array $array)
{
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $array[$key] = self::array_to_object($value);
        }
    }
    return (object)$array;
}

10voto

vdegenne Punkte 9972

Ich würde auf jeden Fall einen sauberen Weg wie diesen wählen:

<?php

class Person {

  private $name;
  private $age;
  private $sexe;

  function __construct ($payload)
  {
     if (is_array($payload))
          $this->from_array($payload);
  }

  public function from_array($array)
  {
     foreach(get_object_vars($this) as $attrName => $attrValue)
        $this->{$attrName} = $array[$attrName];
  }

  public function say_hi ()
  {
     print "hi my name is {$this->name}";
  }
}

print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();

?>

wenn Sie einreichen:

formulaire

werden Sie dies erhalten:

mike

Ich fand dies im Vergleich zu den obigen Antworten von Objects should be used for the purpose they've made for (encapsulated cute little objects) logischer.

Auch die Verwendung von get_object_vars stellt sicher, dass keine zusätzlichen Attribute im manipulierten Objekt erstellt werden (Sie wollen nicht, dass ein Auto einen Familiennamen hat oder eine Person 4 Räder hat).

8voto

slevy1 Punkte 3689

Sie könnten zum Beispiel auch ein ArrayObject verwenden:

<?php
    $arr = array("test",
                 array("one"=>1,"two"=>2,"three"=>3), 
                 array("one"=>1,"two"=>2,"three"=>3)
           );
    $o = new ArrayObject($arr);
    echo $o->offsetGet(2)["two"],"\n";
    foreach ($o as $key=>$val){
        if (is_array($val)) {
            foreach($val as $k => $v) {
               echo $k . ' => ' . $v,"\n";
            }
        }
        else
        {
               echo $val,"\n";
        }
    }
?>

//Output:
  2
  test
  one => 1
  two => 2
  three => 3
  one => 1
  two => 2
  three => 3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X