2010-07-24 84 views
0

返回數據,我有點PHP的新手這樣下去容易對我:)PHP將不會從功能

我想對檢索到的條目返回的類別名稱,確定類別是否爲後最低的孩子。我的sql語句返回多個重複的條目(對於它所處的每個類別和子類別 - 即如果條目在Cars> Parts> Engine> Crankshafts中,它將出現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 />"; 
} 

上面的代碼回顯出正確的類別,但不會將它返回到底部foreach循環中的$ cat_name變量。

我希望我已經夠清楚了,謝謝你的幫助!

+0

會不會''判斷_child();'裏面的函數創建連續循環? – jolt 2010-07-24 23:30:02

+0

否,因爲$ cat_id每次都會更改,直到它不返回任何結果。 – Leon 2010-07-24 23:37:47

回答

0

這裏有一些有點令人困惑的事情。

a)您不應該在函數中使用全局$ cat_name,因爲您將它作爲多次更改的參數傳遞,而不是一個全局變量。

b)每當您調用具有子類的類別的determine_child時,您的方法不會返回任何內容。

c)如果存在多個最低級別類別,您要做什麼?例如,你的determine_child方法循環遍歷所有的孩子 - 它只應該找到它找到的第一個最低級別的類別,還是應該將它們全部打印出來?

如果答案C是你希望它只是打印出一類,那麼你可以簡單地添加return語句If條件:return determine_child($entry_id, $cat_id, $cat_name); - 雖然這將是更好地擺脫的for循環和公正改用第一個查詢結果。

如果對c的回答有些不同,那麼這就會產生一個完全不同的問題 - 所以需要確切地知道你想要的結果是什麼。

+0

a)刪除了這個! b)如果類別確實有孩子,我需要確定該類別是否有孩子(該項目屬於),因此是循環。 c)我只需要返回一個結果,因爲一個項目只能屬於一個類別。 (自動分配給它的父類別) – Leon 2010-07-24 23:51:05

+0

b)有一個循環是好的(儘管如果你是正確的,$ query-> num_rows將始終是0或1;所以它不是一個真正的'循環',因此,你可以使用第一項),但你仍然需要返回一些東西。 例如,如果A是B的父親,您將爲A調用determine_child,然後A調用determine_child並計算結果 - 但沒有返回結果,因此當您返回A時,您已經丟失了你計算的是什麼。如上所述在return return_child..'中添加應該解決這個問題。 – user11977 2010-07-24 23:55:09

+0

我明白了!它修復了它,非常感謝! – Leon 2010-07-25 00:23:16