PHP脚本中的函数错误

时间:2014-04-03 22:51:56

标签: php mysql

我一直在与一个人给我的非常酷的剧本进行摔跤,试图让它适应我的网站。我越来越近了,但我仍然遇到两个令我困惑的错误。

首先:警告:为foreach()提供的参数无效 ...

这是foreach声明:

foreach ($Topic as $Topics)

它遵循一个功能:

function generate_menu_items($PopTax, $Topics, $Current_Topic)

我认为问题与函数中的中间值有关 - $ Topics。我不明白它是如何衍生出来的。我的猜测是它应该是所有可能主题的数组(在我的数据库中由$ MyTopic表示)。但是我并不熟悉函数,我不明白为什么在数据库查询之前将函数和foreach放在一起。 (但是,有一个更通用的数据库查询,它在食物链的上方建立了一些这些值。)

这是第二个问题:致命错误:调用未定义的函数render_menu() ...

有谁能告诉我应该如何以及在哪里定义这个功能?


让我简要解释一下这个剧本的全部内容。首先想象一下这些网址:

的MySite /主题/动物 mysite的/主题/动物的家园 mysite的/主题/动物生态学 mysite的/主题/哺乳动物生态学 的MySite /主题/鸟生态学

两个键值与每个URL相关联 - $ PopTax(流行名称)和$ MyTopic。对于前三个URL,$ PopTax = Animal,而另外两个是Mammal和Bird。 $ MyTopic =最后三行的生态学。对于前两个,$ MyTopics = Introduction and Homes。

两个值(Tax_ID和Topic_ID)的ID都只是名称的前三个字母(例如Mam = Mammal,Eco = Ecology)。此外,Life是动物的父母,它是脊椎动物的父母,它是哺乳动物的父母。

现在我只想把它们全部拉到一起,在侧边栏中创建一个小索引。因此,如果您访问MySite / topics / animal-ecology,您可以在侧栏中看到所有动物主题的列表...

<a href="/topic/animal" title="Animals">Animals</a>
<a href="/topic/animal-classification" title="Animal Classification">Animal Classification</a>
<a href="/topic/animal-homes" title="Animal Homes">Animal Homes</a>
<a href="/topic/animal-ecology" title="Animal Ecology">Animal Ecology</a>

正如你所看到的那样,存在一些案例和复数差异(动物与动物),尽管我并不认为这与我遇到的问题有关。

但我不确定我的代码是否需要进行调整,或者是否存在奇怪的问题。有些事情对我来说并不合适。感谢您的任何提示。


$Tax_ID = 'Mam'; // Mam represents Mammal
$Current_Topic = 'Homes';

function generate_menu_items($PopTax, $Topics, $Current_Topic)
{ 
    $menu_items = array(); 

    foreach ($Topic as $Topics) 
    { 
     $url   = "/topics/$PopTax[PopTax]-$Topic[MyTopic]"; 
     $title = "$PopTax[PopTax] $Topic[MyTopic]"; 
     $text  = $Topic['MyTopic']; 

    if ($Topic === 'People') { 
        $url   = "$PopTax[PopTax]-and-$Topic[MyTopic]"; 
        $title = "$PopTax[PopTax] and $Topic[MyTopic]"; 
        $text  = "$PopTax[PopTax] &amp; $Topic[MyTopic]"; 
    } 

    if ($Topic === 'Movement' && $PopTax['Parent'] == 'Ver' && $PopTax['PopTax'] != 'Human') { 
        $url   = "$PopTax[PopTax]-locomotion"; 
        $title = "$PopTax[PopTax] Locomotion"; 
        $text  = "Locomotion"; 
    } 

    $menu_items[] = array( 
        'url'    => strtolower($url), 
        'title'  => ucwords($title), 
        'text'   => ucfirst($text), 
        'active' => ($Topic['MyTopic'] === $Current_Topic) 
    ); 
  } 

    return $menu_items; 
}

function generate_menu_html($menu_items)
{
 $list_items = array();

 foreach ($menu_items as $item)
 {
    if ($item['active']) {
        $list_items[] = "<li><span class=\"active\">$item[text]</b></span></li>";
    } else {
        $list_items[] = "<li><a href=\"$item[url]\" title=\"$item[title]\">$item[text]</a></li>";
    }

 }

 return '<ol>' . implode("\n", $list_items) . '</ol>';
}

$stm = $pdo->prepare("SELECT T.Topic_ID, T.MyTopic
FROM gz_topics T
JOIN gz_topics_poptax TP ON TP.Topic_ID = T.Topic_ID
WHERE TP.Tax_ID = :Tax_ID");

$stm->execute(array('Tax_ID' => $Tax_ID));
// Fetch all rows (topics) as an associative array
$Topics = $stm->fetchAll(PDO::FETCH_ASSOC);

// Get the DB row for the taxon we're dealing with
$stm = $pdo->prepare("SELECT Tax.ID, Tax.PopTax, Tax.Parent
FROM gz_poptax Tax
WHERE Tax.ID = :Tax_ID");

$stm->execute(array('Tax_ID' => $Tax_ID));
// Fetch a single row, as the query should only return one row anyway
$PopTax = $stm->fetch(PDO::FETCH_ASSOC);

// Call our custom functions to generate the menu items, and render them as a HTML list
$menu_items = generate_menu_items($PopTax, $Topics, $Current_Topic);
$menu_html = render_menu($menu_items);

// Output the list to screen
echo $menu_html;

1 个答案:

答案 0 :(得分:2)

你想要foreach ($Topics as $Topic)。您在$Topic中循环遍历每个$Topics是另一种思考它的方式。