За последние 24 часа нас посетили 142660 программистов и 6315 роботов. Сейчас ищет 2051 программист ...

Доступ к многомерному массиву

Тема в разделе "PHP для новичков", создана пользователем oslayer, 23 окт 2012.

  1. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Как получить доступ к элементам многомерного массива $children
    Например мне нужно получить в переменную или вывести на экран вот эти данные из массива $children

    Код (Text):
    1.   ["name"]=> string(2) "we"
    Привожу содержимое массива
    Код (Text):
    1.  
    2. array(2)
    3. { [0]=> array(4)
    4. { ["id_category"]=> string(1) "6" ["name"]=> string(2) "we" ["link_rewrite"]=> string(2) "we" ["id_shop"]=> string(1) "1" }
    5. [1]=> array(4)
    6. { ["id_category"]=> string(2) "20" ["name"]=> string(16) "Продукт 2" ["link_rewrite"]=> string(9) "product_2" ["id_shop"]=> string(1) "1" } }
    7.  
    8.  array(0) { }
    9.  
    10.  array(1)
    11.  { [0]=> array(4)
    12.  { ["id_category"]=> string(2) "21" ["name"]=> string(2) "df" ["link_rewrite"]=> string(2) "df" ["id_shop"]=> string(1) "1" } }
    13.  
    14.  array(0) { }
    15.  
    16.  array(0) { }
    17.  
    18.  array(1)
    19.  { [0]=> array(4)
    20.  { ["id_category"]=> string(1) "8" ["name"]=> string(10) "Белые" ["link_rewrite"]=> string(10) "white_mugs" ["id_shop"]=> string(1) "1" } }
    21.  
    22.  array(0) { }
    23.  
    24.  array(1)
    25.  { [0]=> array(4)
    26.  { ["id_category"]=> string(2) "10" ["name"]=> string(14) "Красные" ["link_rewrite"]=> string(3) "red" ["id_shop"]=> string(1) "1" } }
    27.  
    28.  array(0) { }
    29.  
    30.  array(1)
    31.  { [0]=> array(4)
    32.  { ["id_category"]=> string(2) "12" ["name"]=> string(16) "Флисовые" ["link_rewrite"]=> string(5) "flees" ["id_shop"]=> string(1) "1" } }
    33.  
    34.  array(0) { }
    35.  
    36.  array(1)
    37.  { [0]=> array(4) { ["id_category"]=> string(2) "13" ["name"]=> string(3) "ibm" ["link_rewrite"]=> string(3) "ibm" ["id_shop"]=> string(1) "1" } }
    38.  
    39.  array(0) { }
    40.  
    41.  array(2)
    42.  { [0]=> array(4)
    43.  { ["id_category"]=> string(2) "17" ["name"]=> string(12) "Ручная" ["link_rewrite"]=> string(8) "handmade" ["id_shop"]=> string(1) "1" }
    44.  [1]=> array(4)
    45.  { ["id_category"]=> string(2) "19" ["name"]=> string(18) "Фабричная" ["link_rewrite"]=> string(6) "fabric" ["id_shop"]=> string(1) "1" } }
    46.  
    47.  array(0) { }
    48.  
    49.  array(1)
    50.  { [0]=> array(4) { ["id_category"]=> string(2) "18" ["name"]=> string(12) "третий" ["link_rewrite"]=> string(3) "3rd" ["id_shop"]=> string(1) "1" } }
    51.  
    52.  array(1)
    53.  { [0]=> array(4)
    54.  { ["id_category"]=> string(2) "22" ["name"]=> string(18) "четвертый" ["link_rewrite"]=> string(4) "four" ["id_shop"]=> string(1) "1" } }
    55.  
    56.  array(0) { }

    Пожалуйста покажите как это делается?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    $children[0]['name']
     
  3. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Странный набор массивов....

    Вот маленький код
    Код (PHP):
    1. <?php
    2. $array[0]["id_category"] = "6";
    3. $array[0]["name"] = "we";
    4. $array[0]["link_rewrite"] = "we";
    5. $array[0]["id_shop"] = "1";
    6. $array[1]["id_category"] = "20";
    7. $array[1]["name"] = "Продукт 2";
    8. $array[1]["link_rewrite"] = "product_2";
    9. $array[1]["id_shop"] = "1";
    10.  
    11. foreach ($array as $key => $value) {
    12.     if (isset($value['name'])) {
    13.         echo 'Ключ: ' . $key . '. Значение [name]: ' . $value['name'] . '</br>';
    14.     }
    15. } 
     
  4. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Приведен вот такой пример
    Код (Text):
    1.  
    2. $children[0]['name']
    Как в таком случае должена выглядеть конструкция, если мне нужно получить доступ к последнему массиву (см. предпоследнюю строчку в приведенном в начале поста листинга массива)
    Код (Text):
    1. ["name"]=> string(18) "четвертый"
     
  5. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    в твоём случае это
    Код (Text):
    1. array(2)
    2. { [0]=> array(4)
    3. { ["id_category"]=> string(1) "6" ["name"]=> string(2) "we" ["link_rewrite"]=> string(2) "we" ["id_shop"]=> string(1) "1" }
    4. [1]=> array(4)
    5. { ["id_category"]=> string(2) "20" ["name"]=> string(16) "Продукт 2" ["link_rewrite"]=> string(9) "product_2" ["id_shop"]=> string(1) "1" } }
     
  6. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Для доступа к последнему массиву который содержит
    Код (Text):
    1. ["name"]=> string(18) "четвертый"
    в массиве $children
    Вот так должна выглядеть строчка?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    $children[1]['name']
     
  8. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Не работает $children[1]['name'] я получаю ["name"]=> string(2) "df", а нужно получить ["name"]=> string(18) "четвертый"

    Посмотрите пожалуйста полный листинг массива, он приведен в начале поста
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    там у тебя нет "листинга массива". там у тебя несколько массивов.
     
  10. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    этот листинг получен командой
    Код (Text):
    1. var_dump($children)
    Вот здесь описание этой команды http://php.su/functions/?var_dump

    т.е. я полагаю что $children это многомерный массив.. возможно ошибочно.
     
  11. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    значит ты этой функцией пользуешься в цикле где-то
    "листинг массива" должен быть такием
    Array(Array(Array()));
    а сейчас у тебя
    Array(Array());Array(Array());Array();Array(Array()).... и т.д
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    нет. этот "листинг" получен в цикле. а значит тебе надо будет объяснить, как тебе отловить нужный тебе массив в этом цикле... а ты даже не понимаешь, что у тебя там творится, значит код не твой, значит вслепую через форум можно позеленеть объяснять.

    давай код этого места с запасом.
     
  13. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Да, действительно.. выводится в цикле.. что еще больше усложняет мне жизнь :(
    Код (PHP):
    1.     private function getCategory($id_category, $id_lang = false, $id_shop = false)
    2.     {
    3.         $id_lang = $id_lang (int)$id_lang : (int)Context::getContext()->language->id;
    4.         $category = new Category((int)$id_category, (int)$id_lang);
    5.         if ($category->level_depth > 1)
    6.         $category_link = $category->getLink();
    7.         else
    8.             $category_link = $this->context->link->getPageLink('index');
    9.  
    10.         if (is_null($category->id))
    11.             return;
    12.  
    13.         $children = Category::getChildren((int)$id_category, (int)$id_lang, true, (int)$id_shop);
    14.         var_dump($children);
    15.     
    16.         $selected = ($this->page_name == 'category' && ((int)Tools::getValue('id_category') == $id_category)) ? ' class="sfHoverForce"' : '';
    17.  
    18.         $is_intersected = array_intersect($category->getGroups(), $this->user_groups);
    19.     
    20.         // filter the categories that the user is allowed to see and browse
    21.         if (!empty($is_intersected))
    22.         {
    23.             $this->_menu .= '<li class="alt1"'.$selected.'>';
    24.             $this->_menu .= '[url="'.$category_link.'"]name.'[/url]';
    25. /*        if (count($children))*/
    26. /*var_dump($children);*/
    27. if (count($children))
    28.             /*    if(count($children) & ($ddd=3))*/
    29.             {
    30.                 $this->_menu .='<div class="st"></div><ul class="level2">';
    31.  
    32.                 foreach ($children as $child)
    33.                     $this->getCategory((int)$child['id_category'], (int)$id_lang, (int)$child['id_shop']);
    34.  
    35.                 $this->_menu .='</ul>';
    36.             }
    37.             $this->_menu .= '</li>';
    38.         }
    39.         
    40.     } 
    http://www.phpkode.com/source/p/pre...stashop/modules/blocktopmenu/blocktopmenu.php - здесь файл из которого выдернута эта функция
    http://www.phpkode.com/source/p/prestashop-e-commerce-solution/classes/Category.php - классы которые могут использоватся в blocktopmenu.php

    blocktopmenu.php - как раз и формирует верхнее меню

    Моя сверхзадача состоит в ограничении вложенности верхнего меню, уровнем два. на сайте chemirus.tmweb.ru
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    а в чем сложность-то? =)

    откуда берутся данные и как они там хранятся?
     
  15. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Это правильный вопрос.. но ответа я на него не знаю.. не хватает знаний что бы разобрать файл.
    Практически вложенность категорий задается через интерфейс CMS и хранится вероятнее всего в базе.
    Читается она из базы какой то функцией из Category.php которая вызывается из blocktopmenu.php (как мне кажется)
    переменная level_depth или что то вроде max level depth

    Код (Text):
    1. if(count($children) & ($ddd=2))
    при использовании вот такой строчки в приведенной выше функции корректно работают меню имеющие вложенность два и больше. но не работают имеющие вложенность 1

    Код (Text):
    1. if(count($children) & ($ddd=1))
    при использовании вот такой строчки корректно работают меню имеющие вложенность 1 . но не работают имеющие вложенность 2 и больше

    Может есть какая то возможность глядя на функцию как то логически объединить
    Код (Text):
    1. if(count($children) & ($ddd=2))
    и
    Код (Text):
    1. if(count($children) & ($ddd=1))
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    не очень понятно, как ты хочешь отобразить те пункты, которые были вложены.

    если просто навалить их списком, то наверное это не сложно.
     
  17. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    как это сделать? приведи пример пожалуйста

    Как логически объединить
    Код (Text):
    1. if(count($children) & ($ddd=1))
    Код (Text):
    1. if(count($children) & ($ddd=2))
    может и списком... вот сейчас в цикле var_dump на сайте chemirus.tmweb.ru выведен массив с условием
    Код (Text):
    1. if(count($children) & ($ddd=3))
    Мне нужно вывести с условием $ddd=1 и $ddd=2
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    не, я имел в виду, как это будет выглядеть в итоге? не очень понятно как их всех отобразить в одном списке если они были вложены.

    может просто в цмс исправить содержимое меню?
     
  19. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Меню в CMS формируется динамически и как раз файл blocktopmenu.php отвечает за вывод и формирование менюшки.
    Все таки можешь подсказать, как сделать это.. посмотри мое предыдущее сообщение
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.068
    Симпатии:
    7
    :DDDDD

    ужас нах.


    Код (PHP):
    1. if(count($children) & ($ddd=3)) 
    $bbb=3 вы присваиваете 3, а надо?)

    Что конкретно нужно сделать, что - то не врубаюсь.
     
  21. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
  22. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Верхнее меню имеет глубину вложенности до 3 уровня. Мне нужно ограничить глубину вложенности до 2 уровня.
    Как то вот так.
     
  23. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    Не работает такой вариант ==
     
  24. oslayer

    oslayer Активный пользователь

    С нами с:
    23 окт 2012
    Сообщения:
    18
    Симпатии:
    0
    За поговорить все горазды.. вот только опыта похоже решать реальные зазадчи не хватает, жаль. А еще форум назыается
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    не можешь даже объяснить что тебе требуется, а у тебя все вокруг дураки.
    один ты блин умный.