Xpoint
   [напомнить пароль]

stdClass - получить список переменных

Метки: [без меток]
2009-05-19 08:36:26 [обр] Roman Gaag[досье]

Всем добрый день.
В классе, который написал "соседний" программист, есть объект $Auth, который является объектом типа stdClass.
Выполняется запрос такого вида:

$Auth = $this->DB->site->queryRow($sql, array(), MDB2_FETCHMODE_OBJECT);

После чего мы получаем

object(stdClass)#15 (25) {
  ["id"]=>
  string(5) "37171"
  ["forum_id"]=>
  string(5) "80087"
  ["forum_name"]=>
  string(9) "romangaag"
  ["roleset"]=>
  string(5) "admin"
  ...
}

Соответственно, обращения к переменным идут так:
$Auth->id.
Мне же нужно получить ассоциативный массив, чтобы можно было обращаться так:
$Auth['id'].

Собтсвенно, вопросы.

  1. Можно ли каким-либо обрзом пролистать переменные данного класса?
  2. Как можно преобразовать его в ассоциативный массив?
спустя 8 минут [обр] Roman Gaag[досье]
Хм, ответ нашелся неожиданно. Сам же и отвечаю.
Чтобы перевести объект в ассоциативный массив (чтобы получить доступ к переменным-членам как в массиве), всего-то нужно:
settype($Auth, 'array');
спустя 10 часов [обр] Дмитрий(1/4)[досье]
Что-то мне подсказывает, что в вызове queryRow() второй параметр может быть чем-то вроде MDB2_FETCHMODE_ASSOC или MDB2_FETCHMODE_ARRAY
спустя 3 часа 27 минут [обр] Ali(5/5)[досье]
Согласен с Дмитрием. В первой версии MDB был MDB_FETCHMODE_ASSOC, во второй думаю тоже есть. Тогда сразу на выходе будет массив, без всяких преобразований.
Если уж очень хочется попреобразовывать (не знаю зачем, но друг), то можно привести к типу "массив" так $Auth = (array)$Auth;
P.S. Почитайте type casting и type juggling, найдете много интересного :) Вопросы оттуда часто задаются на разных тестах...
спустя 4 месяца 20 дней [обр] Roman Gaag[досье]

Дело тут в том, что вот это:

$Auth = $this->DB->site->queryRow($sql, array(), MDB2_FETCHMODE_OBJECT);

сидит глубоко в корнях проекта. И менять это нельзя.
А переменной $Auth воспользоваться нужно.

спустя 8 дней [обр] Igor Rulyov(0/19)[досье]
function getAssocArrayFromObj($obj)
{
   if (!is_object($obj)) throw new IllegalArgumentException(gettype($obj));
   $ret = array();
   $objReflect = new ReflectionObject($obj);
   $class_properties = $objReflect->getProperties();
   foreach ($class_properties as $property) {
      $propName = $property->getName();
      $ret[$propName] = $obj->$propName;
   }
   return $ret;
}

function getObjFromAssocArray($row)
{
   if (!is_array(row)) throw new IllegalArgumentException(gettype($row));
   $ret = new stdClass();
   foreach ($row as $f => $v) {
      $ret->$f = $v;
   }
   return $ret;
}
спустя 6 месяцев [обр] profnode[досье]
А я при разработке расширений для Joomla столкнулся с обратной задачей, мне необходимо было из обычного многомерного массива получить stdClass, вот функция которая это делает http://cleverscript.ru/index.php/php/functions/20-stdclass
Powered by POEM™ Engine Copyright © 2002-2005