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
Форумы портала PHP.SU :: Версия для печати :: Создание сложного объекта из свойств другого объекта
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Создание сложного объекта из свойств другого объекта

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

1. master_alf - 19 Августа, 2011 - 12:07:21 - перейти к сообщению
Приветствую.

Вопрос в следующем. Из 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
2. OrmaJever - 19 Августа, 2011 - 12:16:00 - перейти к сообщению
я вобще ничего не понял, но может многомерный масив поможет? Однако
3. Мелкий - 19 Августа, 2011 - 12:18:02 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $a = new stdClass;
  2. $a->o = new stdClass;
4. White - 19 Августа, 2011 - 12:18:20 - перейти к сообщению
master_alf если я вас правильно понял вам нужно каким-то образом в цикле перечислить все свойства объекта, при этом они могут быть разными.
5. DeepVarvar - 19 Августа, 2011 - 12:33:23 - перейти к сообщению
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
6. master_alf - 19 Августа, 2011 - 12:50:54 - перейти к сообщению
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 Недовольство, огорчение

В следующем посте опишу задачу подробнее.
7. Мелкий - 19 Августа, 2011 - 13:04:16 - перейти к сообщению
master_alf пишет:
$items->cl_name = new stdClass;
$items->cl_name = $row->cl_name;

А теперь задумайтесь, что вы этим сделали.
8. DeepVarvar - 19 Августа, 2011 - 13:04:20 - перейти к сообщению
master_alf бред..
Бред в созданном объекте класса DB создавать объект другого класса и в цикле пихать ему свойства.

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

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

Мне нужно сделать сводный отчет вида:
"Компания №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.Сори за объем, но кратко объяснить у меня не получилось.
10. DeepVarvar - 19 Августа, 2011 - 13:14:59 - перейти к сообщению
Прочтите то что я написал выше и еще выше (оба сообщения).
11. master_alf - 19 Августа, 2011 - 13:19:00 - перейти к сообщению
Мелкий пишет:
master_alf пишет:
$items->cl_name = new stdClass;
$items->cl_name = $row->cl_name;

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

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

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

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

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

Вот вам как пример запрос в корзину:
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>

Помоему очень похоже на ваш случай...
(Добавление)
Незачем плодить всюду классы когда можно сделать это обычным массивом..
13. master_alf - 19 Августа, 2011 - 13:42:56 - перейти к сообщению
Согласен, пример очень похож.
Только в Вашем случае просто выводится все, что было приобретено конкретным пользователем. Грубо говоря получается одномерная таблица... т.е. просто список.
1ый товар
2ой товар
3ий товар

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

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

Вот из-за этого и весь мой велосипед придумывается.
Что касается использования массивов вместо классов. Думаю и правда это разумнее, экономичнее и оптимальнее... Но я сейчас только изучаю ООП, потому в данном учебном проекте решаю задачи через него.
14. DeepVarvar - 19 Августа, 2011 - 14:19:39 - перейти к сообщению
Фирма_1, Фирма_2 это тоже что и "ключик в куках 1", "ключик в куках 2"
15. master_alf - 19 Августа, 2011 - 14:31:07 - перейти к сообщению
DeepVarvar пишет:
Фирма_1, Фирма_2 это тоже что и "ключик в куках 1", "ключик в куках 2"

Но в таком случае я не получу статистику по всем фирмам, я получу по одной конкретной. А мне нужно список по всем фирмам.
Если я буду использовать фирму в WHERE, то мне нужно делать кучу запросов.

 

Powered by ExBB FM 1.0 RC1