Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Создание сложного объекта из свойств другого объекта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Возможно ли такое?
master_alf
Отправлено: 19 Августа, 2011 - 12:07:21
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Приветствую.

Вопрос в следующем. Из MySQL я получаю некий результат, на основании которого мне необходимо создать иерархически структурированный объект.
У меня есть объект с каким-то набором свойств (содержимое полей из базы).
PHP:
скопировать код в буфер обмена
  1.  
  2. $obj->name;
  3. $obj->id;
  4. $obj->sum;
  5. $obj->value;
  6.  

Мне из этих свойств нужно сделать следующий объект
PHP:
скопировать код в буфер обмена
  1.  
  2. $obj->id->name->sum
  3. $obj->id->name->value
  4.  

Проблема в том, что значение id и name
 
 Top
OrmaJever Модератор
Отправлено: 19 Августа, 2011 - 12:16:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




я вобще ничего не понял, но может многомерный масив поможет? Однако


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Августа, 2011 - 12:18:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




PHP:
скопировать код в буфер обмена
  1. $a = new stdClass;
  2. $a->o = new stdClass;


-----
PostgreSQL DBA
 
 Top
White
Отправлено: 19 Августа, 2011 - 12:18:20
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




master_alf если я вас правильно понял вам нужно каким-то образом в цикле перечислить все свойства объекта, при этом они могут быть разными.


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 12:33:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. class obj {
  2.   var $props = array();
  3.   function __construct($props) {
  4.     foreach ($props as $name => $value)
  5.       $this->props[$name] = $value;
  6.     }
  7.   }

или если нужны доступы как до методов используйте __set и __get
(Добавление)
Ага, посмотрел я темку что закрыли - вам точно нужны сет и гет
(Добавление)
http://php.su/learnphp/phpoo/?php5_4
 
 Top
master_alf
Отправлено: 19 Августа, 2011 - 12:50:54
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




OrmaJever пишет:
я вобще ничего не понял, но может многомерный масив поможет? Однако

Многомерный массив, по идее, может помочь. Но у меня везде вывод данных через объекты сделан, не хотелось бы в одном месте использовать массивы, если можно сделать "как и везде".
Ниже подробнее опишу задачу, а то хотел как проще... а получилось как обычно. Огорчение

Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1. $a = new stdClass;
  2. $a->o = new stdClass;

Не помогает, делаю вот так:
PHP:
скопировать код в буфер обмена
  1. while ($row = mysql_fetch_object($tempQRY)) {
  2.         $items->cl_name = new stdClass;
  3.         $items->cl_name = $row->cl_name;
  4.         $items->cl_name->book_id = new StdClass;

В итоге, получается, если смотреть через var_dump();
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. object(stdClass)#4 (1) { ["cl_name"]=> object(stdClass)#3 (0) { } }
  3. object(stdClass)#4 (1) { ["cl_name"]=> string(17) " "Энергия"" }
  4. Warning: Attempt to assign property of non-object in /home/base/class/report.class on line 181

т.е. в первой строке все ок.
Но как только я присваиваю свойству объекта значение от другого объекта, то это свойство становится string... и его как объект уже нельзя использовать. О чем и пишет на следующей строке PHP Недовольство, огорчение

В следующем посте опишу задачу подробнее.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Августа, 2011 - 13:04:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




master_alf пишет:
$items->cl_name = new stdClass;
$items->cl_name = $row->cl_name;

А теперь задумайтесь, что вы этим сделали.


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 13:04:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




master_alf бред..
Бред в созданном объекте класса DB создавать объект другого класса и в цикле пихать ему свойства.

Сделайте DB так чтобы он мог принять запрос и вернуть массив результата.
Сделайте узловой объект, который будет на лету добавлять другие объекты как свойства.
Обращайтесь из любого объекта к другому объекту через узловой.
 
 Top
master_alf
Отправлено: 19 Августа, 2011 - 13:10:17
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Задача вот какая.

В базе хранится история продаж, в трех разных таблицах.
Кто купил, что купил, и когда купил.

Мне нужно сделать сводный отчет вида:
"Компания №1 купила товар №2 (кол-во), товар №3(кол-во), товар№4(кол-во) и т.д.", и для наглядности нужно это все расчертить красивой таблицей.
Я делаю запрос к базе и получаю по каждой компании данные.
Но в одной строке результата я получаю данные по одному виду товаров для компании. Соответственно если я так же и буду выводить, то у меня получиться не наглядная таблица.
Будет что-то вроде
"Компания №1 товар №2
Компания №1 товар №3
Компания №1 товар №4"...
Что бы от этого уйти, мне нужно из строк результата MySQL свести данные воедино.
Т.е. получить структуру примерно следующего вида:
$obj(компания)->tovar_id(цифра товара)->count(количество проданного)
И уже в результирующей таблице я сделаю нужный вывод информации.
Вот и вопрос, собственно, каким образом я могу сделать нужный мне вид объекта?

PHP:
скопировать код в буфер обмена
  1.  
  2. $QRY = ""; //запрос
  3. $tempQRY = mysql_query($QRY) or die(mysql_error()); //выполняем запрос
  4.         while ($row = mysql_fetch_object($tempQRY)) { //в цикле заполняем результирующий объект нужными данными.
  5.                 $obj->{$row->tovar_id} = $row->tovar_id
  6.                 $obj->{$row->tovar_id}->count = $row->count
  7. }
  8.                 return $obj;

Логика вот такая. При таком раскладе объект должен бы заполняться правильным образом, т.е. не будут дублироваться покупатели, и по каждому покупателю будет полностью заполнена вся его история...
но как правильно исполнить эту запись? вот чего понять не могу Недовольство, огорчение

P.S.Сори за объем, но кратко объяснить у меня не получилось.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 13:14:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Прочтите то что я написал выше и еще выше (оба сообщения).
 
 Top
master_alf
Отправлено: 19 Августа, 2011 - 13:19:00
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Мелкий пишет:
master_alf пишет:
$items->cl_name = new stdClass;
$items->cl_name = $row->cl_name;

А теперь задумайтесь, что вы этим сделали.

Как я понимаю - глупость Радость
Только не уверен почему... Но Ваш совет я понял именно так >_<
Наверное, тип объекта перезаписывается при присваивании значения из свойства другого объекта?..

DeepVarvar пишет:
Сделайте DB так чтобы он мог принять запрос и вернуть массив результата..

Я, конечно, могу получить данные в виде массива, но каким образом я смогу слепить такой объект, как мне нужен - так и не пойму. Огорчение
(Добавление)
DeepVarvar пишет:
Прочтите то что я написал выше и еще выше (оба сообщения).

Сообщения прочел сразу, но для начала решил более точно описать, что же мне нужно.
Про __set и __get не читал, сейчас ознакомлюсь.
Спасибо за совет.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 13:25:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




То что вы делаете можно получить одним запросом в базу, уже в массив с количеством и т.д...

Вот вам как пример запрос в корзину:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT b.product_id,COUNT(b.product_id) cnt,p.name,p.price
  2.         FROM basket b
  3.         LEFT JOIN products p ON (p.id = b.product_id)
  4.         WHERE b.hash = 'ключик в куках'
  5.         GROUP BY b.product_id ORDER BY cnt DESC

Вот вам вывод:

CODE (html):
скопировать код в буфер обмена
  1. <?php foreach ($b_products as $b_product) {?>
  2.         <li>
  3.                 <b><?=$b_product['name']?></b>
  4.                 <?=$b_product['cnt']?> шт.
  5.                 (<?=($b_product['price']*$b_product['cnt'])?> руб.)
  6.                 [<a href="?add=<?=$b_product['product_id']?>">+1</a>] /
  7.                 [<a href="?minus=<?=$b_product['product_id']?>">-1</a>] /
  8.                 [<a href="?del=<?=$b_product['product_id']?>">удалить</a>]
  9.         </li>
  10. <?php } ?>
  11. </ul>

Помоему очень похоже на ваш случай...
(Добавление)
Незачем плодить всюду классы когда можно сделать это обычным массивом..
 
 Top
master_alf
Отправлено: 19 Августа, 2011 - 13:42:56
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Согласен, пример очень похож.
Только в Вашем случае просто выводится все, что было приобретено конкретным пользователем. Грубо говоря получается одномерная таблица... т.е. просто список.
1ый товар
2ой товар
3ий товар

Мне нужно получить таблицу вида
Название | товар 1 | товар 2| товар 3|
Фирма_1 | 3шт | 0 шт | 2 шт |
Фирма_2 | 1шт | 2 шт | 0 шт |

При Вашей же реализации получится что-то вроде
Фирма_1 | 3шт
Фирма_1 | 0шт
Фирма_1 | 2шт

Вот из-за этого и весь мой велосипед придумывается.
Что касается использования массивов вместо классов. Думаю и правда это разумнее, экономичнее и оптимальнее... Но я сейчас только изучаю ООП, потому в данном учебном проекте решаю задачи через него.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 14:19:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Фирма_1, Фирма_2 это тоже что и "ключик в куках 1", "ключик в куках 2"
 
 Top
master_alf
Отправлено: 19 Августа, 2011 - 14:31:07
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




DeepVarvar пишет:
Фирма_1, Фирма_2 это тоже что и "ключик в куках 1", "ключик в куках 2"

Но в таком случае я не получу статистику по всем фирмам, я получу по одной конкретной. А мне нужно список по всем фирмам.
Если я буду использовать фирму в WHERE, то мне нужно делать кучу запросов.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB