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

Тема в разделе "PHP", создана пользователем SergXP, 16 ноя 2011.

Модераторы: latteo
  1. SergXP

    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
            
    )
    )
    похоже тут либо рекурсия нужна, либо использование указателя &
    есть идеи? ))
    Спасибо!
     
  2. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    253
    Симпатии:
    58
    А зачем вся эта химия?

    Впрочем есть другой вариант
    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();
    То есть в методе возвращается сам объект.
     
  3. SergXP

    SergXP Постоялец

    Регистр.:
    8 мар 2008
    Сообщения:
    66
    Симпатии:
    11
    это еще более извращенная форма )))))

    вообще вот, удалось реализовать использовав рекурсию:
    PHP:
        public function _arrtoobject($arr,$val) {
      if (
    == 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
     
  4. _wi

    _wi Создатель

    Регистр.:
    2 окт 2011
    Сообщения:
    24
    Симпатии:
    5
    массив в объект

    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($obj1),'</pre>';
    Выведет:
    PHP:
    stdClass Object
    (
        [
    foo] => stdClass Object
            
    (
                [
    bar] => stdClass Object
                    
    (
                        [
    baz] => stdClass Object
                            
    (
                            )
                    )
            )
    )
     
    SergXP нравится это.
  5. SergXP

    SergXP Постоялец

    Регистр.:
    8 мар 2008
    Сообщения:
    66
    Симпатии:
    11
    О, то что нужно! Признательно благодарен! Правда ф-цию 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($obj1),'</pre>';