ФорумПрограммированиеPHP для идиотов → PHP и массив объектов

PHP и массив объектов

  • Raffi

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 11 июля 2008 г. 11:22

    Привет, может кто знает, как можно сделать следующее:
    Имеем следующую структуру в базе данных:

    ID | Parent | Name
    ———————————————
    1 | 0 | Category One
    2 | 1 | Subcategory One
    3 | 0 | One more category
    4 | 2 | Sub-sub category
    … и т.д.

    Мне нужен PHP класс, который данную таблицу сериализует в следующий
    формат:
    [
    {
    "Name" : "Category One",
    "ID" : 1,
    "Children" : [
    {
    "Name" : "Subcategory One",
    "ID" : 2,
    "Children" : …
    }
    ]
    },
    {
    "Name" : "One more category",
    "ID" : 3,
    "Children" : [ ]
    }
    ]
    т.е. массив объектов, в каждом из которых есть массив дочерних элементов, т.е. рекурсивная модель.
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 11 июля 2008 г. 13:01, спустя 1 час 38 минут 35 секунд

    По-моему скромному мнению, сначала придется рукурсивно заполнить массив, а потом уже перевести его в строку соответствии с указанным стилем.
    Делов на час максимум :)
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 11 июля 2008 г. 13:37, спустя 35 минут 39 секунд

    а в чем проблема? код в стулию!
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 12 июля 2008 г. 0:52, спустя 11 часов 14 минут 51 секунду

    Мавр, это Вы кому? (:
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 12 июля 2008 г. 2:18, спустя 1 час 26 минут 51 секунду

    А эт че за формат? JSON?
  • Kuzya

    Сообщения: 26 Репутация: N Группа: Кто попало

    Spritz 14 июля 2008 г. 5:39, спустя 2 дня 3 часа 20 минут

    Мб просто двумерный массив использовать?
  • fresh

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 20 ноября 2009 г. 5:53, спустя 494 дня 1 час 13 минут

    Всем здрасте!

    Есть нубо-класс:

    class class_rubric {
    public $id_rubr;
    public $rubr_name;
    public $rubr_port_count;

    public function getLink() {
    return "<A HREF=\"".$_SERVER['PHP_SELF']."?id_rubric=".$this->id_rubr."\">".$this->rubr_name." (".$this->rubr_port_count.")</A>";
    }


    есть функция:
    // функция возвращает список рубрик 
    function getRubric() {
    $tmp= new class_mysql;
    $tmp->open();
    $sql = "
    SELECT Port_Rubric.Id_rubric, Port_Rubric.Rubric_Name, COUNT(*) as CNT
    FROM Portfolio, Port_Rubric
    WHERE
    Port_Rubric.Id_Rubric = Portfolio.Id_rubric
    GROUP BY
    Port_rubric.Id_rubric,
    Port_rubric.Rubric_name;";
    global $rubric;
    $rubric[] = new class_rubric;
    $array = $tmp->query($sql, 0);
    if (is_array($array)) {
    $i = 0;
    foreach($array as $obj) {
    $rubric[$i]->id_rubr = $obj->Id_rubric;
    $rubric[$i]->rubr_name = $obj->Rubric_Name;
    $rubric[$i]->rubr_port_count = $obj->CNT;
    $i++;
    }
    } else {
    $result = false;
    }
    unset($sql);
    unset($obj);
    unset($array);
    unset($tmp);
    return $rubric;
    }

    хотелось бы каким то грамотным способом выводить их на страницу,
    используя вот такой код:
    getRubric();
    for($i=0;$i < count($rubric); $i++){
    echo $rubric[$i]->getLink();
    }


    выходит ошибка:
    Fatal error: Call to undefined method stdClass::getLink()

    подскажите как правильно реализовать массив классов ?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 20 ноября 2009 г. 5:57, спустя 4 минуты 10 секунд

    код - жепь…..
    for($i=0;$i < count($rubric); $i++){
    echo $rubric[$i]->getLink();
    }

    начнем хотябы с того , что тут стоит делать foreach

    global $rubric;
    $rubric[] = new class_rubric;

    это вообще антипаттерн какойто….

    и обьясни мне суть вот этого класса :
    class class_rubric {
    public $id_rubr;
    public $rubr_name;
    public $rubr_port_count;

    public function getLink() {
    return "<A HREF=\"".$_SERVER['PHP_SELF']."?id_rubric=".$this->id_rubr."\">".$this->rubr_name." (".$this->rubr_port_count.")</A>";
    }
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 20 ноября 2009 г. 5:57, спустя 37 секунд


           $rubric[] = new class_rubric; // ЭТО
           $array = $tmp->query($sql, 0);
           if (is_array($array)) {
                   $i = 0;
                   foreach($array as $obj) {
                           // НАДО ДЕЛАТЬ ТУТ
                           $rubric[$i]->id_rubr = $obj->Id_rubric;
    adw/0
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 20 ноября 2009 г. 6:01, спустя 4 минуты 1 секунду

    fresh, без обид, но говнокод у тебя дикий….
    вот тут например, зачем ты сетаешь false в переменную $result ??????
    if (is_array($array)) {
    $i = 0;
    foreach($array as $obj) {
    $rubric[$i]->id_rubr = $obj->Id_rubric;
    $rubric[$i]->rubr_name = $obj->Rubric_Name;
    $rubric[$i]->rubr_port_count = $obj->CNT;
    $i++;
    }
    } else {
    $result = false;
    }
  • fresh

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 20 ноября 2009 г. 6:08, спустя 6 минут 53 секунды


    код - жепь…..

    Я еще совсем нубас который учится, не ругайся насяльника)

    начнем хотябы с того , что тут стоит делать foreach

    foreach($rubric as $element) {
    $element->getLink();
    }
    так?

    это вообще антипаттерн какойто….

    тут уберу глобал, в основном документе сделаю $Rubr = getRubric();

    и обьясни мне суть вот этого класса :


    public $id_rubr; // код рубрики
    public $rubr_name; // название рубрики
    public $rubr_port_count; // количество документов в данной рубрике

    Хочу сделать что б выводилось в виде:
    Рубрика 1 (3)
    Рубрика 2 (14)
    Рубрика 3 (4)

    Рубрика N (X)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 20 ноября 2009 г. 6:13, спустя 4 минуты 50 секунд

    Хочу сделать что б выводилось в виде:
    Рубрика 1 (3)
    Рубрика 2 (14)
    Рубрика 3 (4)

    Рубрика N (X)

    ну что ты хочешь сделать я понял из твоего кода….
    просто зачем тут класс ???
  • fresh

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 20 ноября 2009 г. 6:17, спустя 3 минуты 47 секунд


    Хочу сделать что б выводилось в виде:
    Рубрика 1 (3)
    Рубрика 2 (14)
    Рубрика 3 (4)

    Рубрика N (X)

    ну что ты хочешь сделать я понял из твоего кода….
    просто зачем тут класс ???
    Ну как минимум познакомиться с классами, что это и как их вкуснее приготовить
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 20 ноября 2009 г. 6:24, спустя 7 минут 25 секунд

    ну раз хочется познакомится с классами, то пробуй по крайней мере хотя бы так….
    <?php

    class Rubric
    {
    protected $_dbObject;   // your database adapter  (in your case it's "class_mysql")

    /**
    * Retrieve all rubrics
    *
    * @return array
    */
    public function getAllRubrics()
    {
    $this->_dbObject->run($yourSqlQuery); // run your query
    return $this->_dbObject->fetchAssoc(); //fetch result into array (or assoc. array)
    }

    /**
    * Retrieve rubrics links as array
    *
    * @return array
    */
    public function getAllRubriksLinks()
    {
    $rubrics = array();
    foreach ($this->getAllRubrics() as $item) {
    $rubrics[] = '<a href="' . $item['href'] . '">' . $item['title'] . ' (' . $item['count'] . ')</a>';
    }
    return $rubrics;
    }
    }


    это далеко не самый идеальный вариант…
  • fresh

    Сообщения: 11 Репутация: N Группа: Кто попало

    Spritz 20 ноября 2009 г. 6:34, спустя 9 минут 21 секунду

    NRG, за примерчик спасибо…бум думать

Пожалуйста, авторизуйтесь, чтобы написать комментарий!