Вопрос о многомерном массиве: откуда взялись ['children']? - PullRequest
0 голосов
/ 04 октября 2009

Я запутался в многомерном массиве.

В следующих db, php и html я не понимаю использование

foreach ($navlist as $key => $list){
foreach ($list as $topkey => $toplist){..

and

foreach ($toplist['children'] as $subkey => $subname){...

А также этот код сбивает меня с толку. Является ли ['children'] php?

$data[0][$row->parentid]['children'][$row->id] = $row->name;

Буду признателен, если вы сможете объяснить это navgation.php

Заранее спасибо.

У меня есть следующее в БД.

INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`)  
VALUES (1, 'shoes', 'Shoes for boys and girls.', '', 'active', 7);
INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`) 
VALUES (2, 'shirts', 'Shirts and blouses!', '', 'active', 7);
[...]
INSERT INTO `categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`)     
VALUES (9, 'test', 'testing', 'Testing!!!!', 'inactive', 0);

Модель имеет следующий php

function getCategoriesNav(){
     $data = array();
     $this->db->select('id,name,parentid');
     $this->db->where('status', 'active');
     $this->db->orderby('parentid','asc');
     $this->db->orderby('name','asc');
     $this->db->groupby('parentid,id');
     $Q = $this->db->get('categories');
     if ($Q->num_rows() > 0){
       foreach ($Q->result() as $row){
            if ($row->parentid > 0){
                $data[0][$row->parentid]['children'][$row->id] = $row->name;

            }else{
                $data[0][$row->id]['name'] = $row->name;
            }
        }
    }
    $Q->free_result(); 
    return $data; 
 }

И контроллер / navigation.php

  if (count($navlist)){
  echo "<ul>";
  foreach ($navlist as $key => $list){
    foreach ($list as $topkey => $toplist){
        echo "<li class='cat'>";
        echo anchor("welcome/cat/$topkey",$toplist['name']);
        echo "</li>\n";
        if (count($toplist['children'])){
            foreach ($toplist['children'] as $subkey => $subname){
                echo "\n<li class='subcat'>";
                echo anchor("welcome/cat/$subkey",$subname);    
                echo "</li>";
            }
        }
    }
  }
  echo "</ul>\n";
}

Это приведет к следующему HTML

<ul>
    <li class='cat'>
        <a href="http://127.0.0.1/codeigniter_shopping/welcome/cat/7" title="clothes">
            clothes
        </a>
    </li>
    <li>
        ...
    </li>
    <li class='subcat'>
        <a href="http://127.0.0.1/codeigniter_shopping/welcome/cat/5" title="toys">
            toys
        </a>
    </li>
 </ul>

1 Ответ

3 голосов
/ 04 октября 2009

Основная конструкция такова:

foreach ($navlist as $key => $list)

Это означает итерацию по массиву $navlist, и каждый раз в $navlist с ключом $key и значением $list выполняется тело цикла foreach.

Может помочь более простой пример.

$numbers = array();
$numbers[0] = "Zero";
$numbers[1] = "One";
$numbers[2] = "Two";

foreach($numbers as $number => $text) {
    echo $number." is written ".$text."\n";
}

Вывод этого (если я где-то не облажался):

0 is written Zero
1 is written One
2 is written Two

В коде, который вы дали, просто есть несколько вложенных циклов, поэтому $list во внешнем цикле for сам по себе является ассоциативным массивом, который затем перебирается, а значения, хранящиеся в этом ассоциативном массиве, также являются массивами.

Может показаться, что вы читаете инструкцию foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...