2013-05-15 2 views
0

Я работаю в CodeIgniter (CI) и пытается создать вложенный набор элементов категории для выпадающего списка. Чтобы создать раскрывающийся список, в CI вам нужно echo form_dropdown('name', $array, $selectedID).Как заполнить массив функцией и использовать этот массив вне функции?

Вот моя функция, чтобы создать вложенный список массив:

$categoryData = array(); 
function list_categories($cats, $sub = ''){ 
    foreach($cats as $cat){ 

     //$cat['category']->id = $sub.$cat['category']->title; 
     $categoryData[$cat['category']->id] = $sub.$cat['category']->title; 

     if(sizeof($cat['children']) > 0){ 
      $sub2 = str_replace('—→ ', '–', $sub); 
      $sub2.= '–→ '; 
      list_categories($cat['children'], $sub2); 
     } 
    } 
} 

Если я буду делать var_dump($categoryData); только сразу после foreach внутри функции list_categories(), он возвращает массив вложенных множеств. Так что это нормально при использовании var_dump() внутри функции. Но мне нужно сделать это:

<?php 
    list_categories($categories); 
    var_dump($categoryData); 
?> 

И вот я получаю пустой массив, вот выход:

array (size=0) 
    empty 

Может кто-нибудь сказать мне, что I'am здесь делаю неправильно?

+0

Ваша функция ничего не возвращает. Поместите '$ categoryData = array();' в первую строку функции и добавьте 'return $ categoryData' в конце функции. Кроме того, вы не назначаете 'list_categories()' никому, когда вы его вызываете: '$ categoryData = list_categories ($ categories);' – billyonecan

+0

Даже если я делаю в конце функции 'return $ categoryData;', она все равно быть пустым, где я делаю 'var_dump()'. Ты знаешь почему ? – aspirinemaga

+0

@aspirinemaga, обновлено. Пожалуйста примите к сведению. – BlitZ

ответ

3

Ваша функция изменяет локальную копию, которая должна быть возвращена в глобальную область. То, что вы хотите достичь, может быть сделано с помощью globals («плохая практика»), return или references.

Попробуйте использовать references:

function list_categories(&$result, $cats, $sub = ''){ // <- THIS 
    foreach($cats as $cat){ 

     //$cat['category']->id = $sub.$cat['category']->title; 
     $result[$cat['category']->id] = $sub.$cat['category']->title; // <- THIS 

     if(sizeof($cat['children']) > 0){ 
      $sub2 = str_replace('&mdash;&rarr;&nbsp;', '&ndash;', $sub); 
      $sub2.= '&ndash;&rarr;&nbsp;'; 

      list_categories($result, $cat['children'], $sub2); // <- THIS 
     } 
    } 
} 

$categoryData = array(); 

list_categories($categoryData, $categories); // <- THIS 

UPD: В конце концов, для возвратной степенной функции, ссылки лучше (как для меня). Извините за неудобство.

+0

Я проверил его, как только вы добавили свой ответ, и он выводит только последний массив. Если вы перейдете в инструкцию foreach, вы заметите, что она идет все глубже и глубже, поэтому, создавая мультимассивы внутри массивов. Есть идеи? BTW Я мог бы проверить его сегодня вечером и дам вам мою обратную связь. Спасибо за сообщение – aspirinemaga

+0

@aspirinemaga, в настоящее время он должен быть рекурсивным. Я впервые задал вопрос. – BlitZ

+0

maan Я тебя люблю! Большое спасибо ! – aspirinemaga

0

вы должны:

function list_categories($cats, $sub = ''){ 
global $categoryData; // add this 

Если нет, то функция не видит глобальный $ categoryData и создает локальные один вместо этого. который он не возвращает.

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

+0

Я где-то читал в разделе «Безопасность PHP», что использование «global ...» не рекомендуется. Разве это не относится к функции? – aspirinemaga

+2

@aspirinemaga это не проблема безопасности. Это «плохо» в «неправильных руках». – BlitZ

+0

@CORRUPT хороший пункт. – Ihsan