массив массивов в массив объектов php - PullRequest
1 голос
/ 14 января 2012

Я пытаюсь преобразовать ассоциативный массив в массив объектов.

$assoc = array (
array(
    'prop1'=>'val1',
    'prop2'=>'val2',
),

array(
    'prop1'=>'val1',
    'prop2'=>'val2',
),
)

Вот код, который у меня есть:

class Assoc {
public function setObject($assoc) {
    $this->assoc[] = new Obj($assoc);
}
}
class Obj {
public function __construct($item) {
    foreach ( $item as $property=>$value ) {
        $this->{$property} = $value;
    }
}
}

$test = New Assoc();
$test->setObject($assoc);

Этот код будет работать дляодин массив, но не массив массивов.Если бы вы могли помочь с тем, что я считаю циклом в функции setObject.

Ответы [ 3 ]

5 голосов
/ 14 января 2012

РЕДАКТИРОВАТЬ для конкретного объекта:

Чтобы придерживаться вашего существующего стиля как можно ближе, не вмешиваясь в array_map voodoo:

class Assoc {
  public function setObject($assoc) {
    foreach ($assoc as $arr) {
      $this->assoc[] = new Obj($arr);
    }   
  }
}
class Obj {
   public function __construct($item) {
     foreach ( $item as $property=>$value ) { 
       $this->{$property} = $value;
     }  
   }   
}

$test = New Assoc();
$test->setObject($assoc);

Оригинал:

Если вам просто нужно общее преобразование, а не конкретные объекты (не совсем понятно в вашем посте?), Вы можете попробовать это:

$new_array = array();
foreach ($assoc as $to_obj)
{
  $new_array[] = (object)$to_obj;
}

// Print results
var_dump($new_array);

выходы:

array(2) {
  [0]=>
  object(stdClass)#1 (2) {
    ["prop1"]=>
    string(4) "val1"
    ["prop2"]=>
    string(4) "val2"
  }
  [1]=>
  object(stdClass)#2 (2) {
    ["prop1"]=>
    string(4) "val1"
    ["prop2"]=>
    string(4) "val2"
  }
}
4 голосов
/ 14 января 2012

Преобразование ассоциативного массива в массив объектов:

$output = array_map(function($element) {
    return (object) $element;
}, $assoc);

Достаточно просто.

РЕДАКТИРОВАТЬ: Если вам нужно сделать объекты определенного класса:

$output = array_map(function($element) use ($classType) {
    return new $classType($element);
}, $assoc);

Вы можете обобщить это на что угодно.

1 голос
/ 14 января 2012
$len = count($assoc);
for($i=0;$i<$len; $i++){
    $assoc[$i] = (Object)$assoc[$i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...