2010-07-24 7 views
0

Я немного PHP новичка так легко идти на меня :)PHP не будет возвращать данные из функции

Я пытаюсь вернуть имя категории для искали записи, после определения, является ли категория самый низкий ребенок.

Мой SQL-оператор возвращает несколько повторяющихся записей (для каждой категории и подкатегории, в которой он находится, т.е. если запись находится в разделе «Автомобили»> «Части»> «Двигатель»> «Коленчатые валы», она появится 4 раза, любой из вас, кто использует Expression Engine должен знать, что он делает это :))

Это SQL заявление, которое возвращает результаты:

SELECT wd.field_id_5, wd.field_id_7, wd.field_id_14, wd.field_id_15, wd.field_id_18, wd.field_id_20, wt.entry_id, wt.title, wt.url_title, cp.cat_id, c.cat_name, c.cat_url_title, c.parent_id FROM exp_weblog_data AS wd LEFT JOIN exp_weblog_titles AS wt ON wd.entry_id = wt.entry_id LEFT JOIN exp_category_posts AS cp ON wt.entry_id = cp.entry_id LEFT JOIN exp_categories as c ON cp.cat_id = c.cat_id WHERE wt.title LIKE '%$term%' 

следующий код, чтобы попытаться получить самую глубокую категорию ребенка, так, чтобы не отображать записи 4 раза.

foreach ($query->result as $row) 
{ 

    $entry_id = $row['entry_id']; 
    $title = $row['title']; 
    $url_title = $row['url_title']; 
    $cat_id = $row['cat_id']; 
    $cat_name = $row['cat_name']; 
    $category_url = $row['cat_url_title']; 
    $parent = $row['parent_id']; 
    $image = $row['field_id_7']; 
    $image_path = "example.com" . $image; 
    $location = $row['field_id_14']; 
    $country = $row['field_id_20']; 
    $currency = $row['field_id_18']; 
    $price = $row['field_id_5']; 
    $postage = $row['field_id_15']; 

    // if the entry id doesnt exist in array already 
    // add into array (all details) 
    if (! array_key_exists($entry_id, $entries)) 
    { 
    $entries[$entry_id] = array($title, $url_title, $cat_id, $cat_name, $category_url, $parent, $image, $image_path, $location, $country, $currency, $price, $postage); 
    } 
} 

$count = 0; 

// for each entry in array, run function to find lowest child and display 
function determine_child($entry_id, $cat_id, $cat_name) 
{ 
    global $DB, $cat_name; 

    $sql = "SELECT c.cat_id, c.cat_name FROM exp_categories AS c INNER JOIN exp_category_posts AS cp ON c.cat_id = cp.cat_id WHERE c.parent_id = '{$cat_id}' AND cp.entry_id = '{$entry_id}'"; 
    $query = $DB->query($sql); 

    if ($query->num_rows > 0) 
    { 

    foreach($query->result as $cat_row) 
    { 
     $entry_id = $entry_id; 
     $cat_id = $cat_row['cat_id']; 
     $cat_name = $cat_row['cat_name']; 

     determine_child($entry_id, $cat_id, $cat_name); 
    } 
    } 
    else 
    { 
    return $cat_name; 
    } 
} // END FUNCTION 


foreach ($entries as $key => $val) 
{ 
    $entry_id = $key; 
    $cat_id = $val[2]; 
    $cat_name = $val[3]; 
    $cat_name = determine_child($entry_id, $cat_id, $cat_name); 

    echo $val[0] . " - " . $cat_name . "<br />"; 
} 

Приведенные выше код вторит из правильной категории, но не возвратит его в переменный $ cat_name в цикле Еогеаспа в нижней части.

Надеюсь, я был достаточно ясен, и спасибо за любую помощь!

+0

Не было бы 'define_child();' внутри функции создавать непрерывный цикл? – jolt

+0

Нет, потому что $ cat_id изменяется каждый раз, пока он не возвращает никаких результатов. – Leon

ответ

0

Здесь несколько вещей, которые здесь немного запутывают.

a) Вы не должны использовать глобальное $ cat_name в своей функции, поскольку вы передаете его как параметр, который изменяется несколько раз, не имея одной глобальной переменной.

b) Всякий раз, когда вы вызываете define_child с категорией, у которой есть дети, ваш метод ничего не возвращает.

c) Что именно вы хотите сделать в случае, если существует несколько категорий нижнего уровня? Например, ваш метод define_child проходит через всех дочерних элементов - должен ли он принимать только первую категорию самого низкого уровня, которую он находит, или должен ли он распечатывать их все?

Если ответ на вопрос о том, что вы хотите, чтобы он просто распечатывал одну категорию, то вы можете просто добавить оператор возврата в условие if: return determine_child($entry_id, $cat_id, $cat_name); - хотя было бы лучше избавиться от цикла for и просто вместо этого используйте первый результат запроса.

Если ответ на c - это что-то другое, это делает его совершенно другой проблемой - так что вам нужно точно знать, что вы хотели бы получить.

+0

a) Удалено это! b) Если у категории есть дети, мне нужно определить, имеет ли эта категория ребенка (к которому принадлежит элемент), следовательно, цикл. c) Мне нужно только вернуть один результат, так как элемент может принадлежать только одной категории. (автоматически назначается родительским категориям) – Leon

+0

b) Наличие цикла в порядке (хотя, если вы правы, $ query-> num_rows всегда будет 0 или 1, поэтому он не является «циклом» как таковым, вы может просто использовать первый элемент), но вам все равно нужно что-то вернуть. Например, если A является родителем B, вы вызываете define_child для A, который в свою очередь вызывает define_child для B и вычисляет этот результат, но ничего не возвращается, поэтому к тому времени, когда вы вернетесь в A, вы потеряли что вы рассчитали. Добавление в 'return define_child..', как упомянуто, должно устранить проблему. – user11977

+0

А я понимаю! Это исправлено, спасибо большое! – Leon

Смежные вопросы