построение массива объектов из обычного массива

SergXP

Постоялец
Регистрация
8 Мар 2008
Сообщения
66
Реакции
11
Всем привет!
Пытаюсь реализовать функцию, которая должна
из обычного массива любого размера, создать массив объектов.
На примере, имеем обычный массив:
PHP:
$arr = array('foo','bar','baz');
как превратить его в объектный массив, чтобы была возможность обращаться к нему таким образом:
PHP:
$arr->foo->bar->baz = 'user';
что-то не соображу)
PHP:
//array('db','user'); val = 'root';
public function _arrtoobject($arr,$val) {
  $tmp = new stdClass;
  foreach ($arr as  $v) {
      $tmp->{$v} = new stdClass;
  }
  return $tmp;
}
получаю такой массив:
PHP:
stdClass Object
(
    [db] => stdClass Object
        (
        )
    [user] => stdClass Object
        (
        )
)
А необходимо такой))
PHP:
stdClass Object
(
    [db] => stdClass Object
        (
          [user] => root
        )
)
похоже тут либо рекурсия нужна, либо использование указателя &
есть идеи? ))
Спасибо!
 
А зачем вся эта химия?

Впрочем есть другой вариант
PHP:
class Ass
{
    public function __construct()
    {
        //Что-то инициализируется...
    }

    public function fuck()
    {
        echo "I'm fuck this ass!";
        return $this;
    }

    public function screw()
    {
        echo "I'm screw this ass!";
        return $this;
    }

    public function pump()
    {
        echo "I'm pump this ass!";
        return $this;
    }
}

$big_ass = new Ass();
$big_ass->fuck()->screw()->pump()->fuck()->screw()->pump()->fuck();
То есть в методе возвращается сам объект.
 
это еще более извращенная форма )))))

вообще вот, удалось реализовать использовав рекурсию:
PHP:
    public function _arrtoobject($arr,$val) {
  if (0 == count($arr)) {
    return $val;
  }
  $tmp = new stdClass;
  reset($arr);
  $k = key($arr);
  $v = current($arr);
  unset($arr[$k]);
  $tmp->{$v} = $this->_arrtoobject($arr,$val);
  return $tmp;  
}
правда это тоже выход не ахти)

это для того, чтобы обрабатывать конфиг INI..
все параметры записываются через точку.. функция же, должна превратить его в массив объектов)
db.username = 'root'
преобразовываем в
echo $cfg->db->username; // результат root
 
массив в объект

PHP:
<?php
$arr = array('foo','bar','baz'); 
$obj = new stdClass; 
for($i = 0; $i < count($arr); $i++) {
  $v = $arr[$i];
  if ($i < 1) {
    $obj->{$v} = new stdClass;
    $t = $obj->{$v};
  }
  else {
    $t->{$v} = new stdClass;
    $t = $t->{$v};
  }
}
echo '<pre>',print_r($obj, 1),'</pre>';
Выведет:
PHP:
stdClass Object
(
    [foo] => stdClass Object
        (
            [bar] => stdClass Object
                (
                    [baz] => stdClass Object
                        (
                        )
                )
        )
)
 
О, то что нужно! Признательно благодарен! Правда ф-цию count, я вынесу за цикл, в целях производительности))

PHP:
$arr = array('foo','bar','baz');  
$obj = new stdClass;
$count = count($arr);
for($i = 0; $i < $count; $i++) { 
  $v = $arr[$i]; 
  if ($i < 1) { 
    $obj->{$v} = new stdClass; 
    $t = $obj->{$v}; 
  } 
  else { 
    $t->{$v} = new stdClass; 
    $t = $t->{$v}; 
  } 
} 
echo '<pre>',print_r($obj, 1),'</pre>';
 
Назад
Сверху