Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个PHP函数可以改进吗?_Php_Javascript - Fatal编程技术网

这个PHP函数可以改进吗?

这个PHP函数可以改进吗?,php,javascript,Php,Javascript,下面是我正在为导航菜单编写的一些代码,如果您在某个页面上,它将向适当的选项卡添加一个“当前”css类 我很好奇,在PHP中是否有更好的方法来实现这一点,因为执行如此简单的任务似乎需要很多代码?我的页面还将加载jquery库,使用jquery而不是PHP设置选项卡是否更好?有什么建议吗 <?PHP active_header('page identifier goes here'); //ie; 'home' or 'users.online' function active_heade

下面是我正在为导航菜单编写的一些代码,如果您在某个页面上,它将向适当的选项卡添加一个“当前”css类

我很好奇,在PHP中是否有更好的方法来实现这一点,因为执行如此简单的任务似乎需要很多代码?我的页面还将加载jquery库,使用jquery而不是PHP设置选项卡是否更好?有什么建议吗

<?PHP

active_header('page identifier goes here'); //ie; 'home' or 'users.online'

function active_header($page_name)
{

    // arrays for header menu selector
    $header_home = array('home' => true);
    $header_users = array(
        'users.online' => true,
        'users.online.male' => true, 
        'users.online.female' => true, 
        'users.online.friends' => true, 
        'users.location' => true, 
        'users.featured' => true, 
        'users.new' => true, 
        'users.browse' => true, 
        'users.search' => true, 
        'users.staff' => true
    );
    $header_forum = array('forum' => true);
    $header_more = array(
        'widgets' => true, 
        'news' => true, 
        'promote' => true, 
        'development' => true, 
        'bookmarks' => true, 
        'about' => true
    );
    $header_money = array(
        'account.money' => true, 
        'account.store' => true, 
        'account.lottery' => true, 
        'users.top.money' => true
    );
    $header_account = array('account' => true);
    $header_mail = array(
        'mail.inbox' => true, 
        'mail.sentbox' => true, 
        'mail.trash' => true, 
        'bulletins.post' => true, 
        'bulletins.my' => true, 
        'bulletins' => true
    );

    // set variables if there array value exist
    if (isset($header_home[$page_name])){
        $current_home = 'current';
    }else if (isset($header_users[$page_name])){
        $current_users = 'current';
    }else if (isset($header_forum[$page_name])){
        $current_forum = 'current';
    }else if (isset($header_more[$page_name])){
        $current_more = 'current';
    }else if (isset($header_money[$page_name])){
        $current_money = 'current';
    }else if (isset($header_account[$page_name])){
        $current_account = 'current';
    }else if (isset($header_mail[$page_name])){
        $current_mail = 'current';
    }

    // show the links
    echo '<li class="' . (isset($current_home) ? $current_home : '') . '"><a href=""><em>Home</em></a></li>';
    echo '<li class="' . (isset($current_users) ? $current_users : '') . '"><a href=""><em>Users</em></a></li>';
    echo '<li class="' . (isset($current_forum) ? $current_forum : '') . '"><a href=""><em>Forum</em></a></li>';
    echo '<li class="' . (isset($current_more) ? $current_more : '') . '"><a href=""><em>More</em></a></li>';
    echo '<li class="' . (isset($current_money) ? $current_money : '') . '"><a href=""><em>Money</em></a></li>';
    echo '<li class="' . (isset($current_account) ? $current_account : '') . '"><a href=""><em>Account</em></a></li>';
    echo '<li class="' . (isset($current_mail) ? $current_mail : '') . '"><a href=""><em>Mail</em></a></li>';
}

?>


首先使用
开关,而不是扩展的
if/else
,-)

底部的两个非常大的代码块可以大大减少为一个简单的循环:

<?php

foreach (array('home', 'users', 'forum' /* ... */ ) as $item) {
  $ar = "header_$item";
  echo '<li class="', (isset($$ar[$page_name]) ? 'current' : '')
    , '"><a href=""><em>', ucword($item), '</em></a></li>';
}

?>


您可以使用变量variable()、foreach和break来减少函数的这一部分

而不是使用页面名称作为数组键,您只需拥有页面名称的数组,然后使用
($page\u name,$array)
进行比较,而不是使用
isset($array[$page\u name])


这将很好地与@meager的修改一起工作,并允许顶部的静态代码位稍微收缩。

整合您的数组,或者将所有逻辑放在另一个命名良好的函数中。我的示例合并了数组

// it's ugly, but at least the ugliness
// is confined to only _one_ array ;)
$map_pages_to_navitem = array(
    'home' => 'home',
    'users.online' => 'users',
    'users.online.male' => 'users',
    'users.online.female' => 'users',
    'users.online.friends' => 'users',
    'users.location' => 'users',
    'users.featured' => 'users',
    'users.new' => 'users',
    'users.browse' => 'users',
    'users.search' => 'users',
    'users.staff' => 'users',
    'forum' => 'forum',
    'widgets' => 'more',
    'news' => 'more',
    'promote' => 'more',
    'development' => 'more',
    'bookmarks' => 'more',
    'about' => 'more',
    'account.money' => 'money',
    'account.store' => 'money',
    'account.lottery' => 'money',
    'users.top.money' => 'money',
    'account' => 'account'),
    'mail.inbox' => 'mail', 
    'mail.sentbox' => 'mail', 
    'mail.trash' => 'mail', 
    'bulletins.post' => 'mail', 
    'bulletins.my' => 'mail', 
    'bulletins' => 'mail', 
);
$current = $map_pages_to_navitem[$page_name];

echo '<li class="'.($current=='home')?'current':''.'"><a href=""><em>Home</em></a></li>';
echo '<li class="'.($current=='users')?'current':''.'"><a href=""><em>Users</em></a></li>';
echo '<li class="'.($current=='forum')?'current':''.'"><a href=""><em>Forum</em></a></li>';
echo '<li class="'.($current=='more')?'current':''.'"><a href=""><em>More</em></a></li>';
echo '<li class="'.($current=='money')?'current':''.'"><a href=""><em>Money</em></a></li>';
echo '<li class="'.($current=='account')?'current':''.'"><a href=""><em>Account</em></a></li>';
echo '<li class="'.($current=='mail')?'current':''.'"><a href=""><em>Mail</em></a></li>';
//很难看,但至少很难看
//仅限于1_u数组;)
$map\u pages\u to\u navitem=数组(
“主页”=>“主页”,
'users.online'=>'users',
'users.online.male'=>'users',
'users.online.female'=>'users',
'users.online.friends'=>'users',
'users.location'=>'users',
'users.featured'=>'users',
'users.new'=>'users',
'用户.浏览'=>'用户',
'users.search'=>'users',
'users.staff'=>'users',
“论坛”=>“论坛”,
“小部件”=>“更多”,
“新闻”=>“更多”,
“升级”=>“更多”,
“开发”=>“更多”,
“书签”=>“更多”,
'关于'=>'更多',
“账户.货币”=>“货币”,
“account.store”=>“money”,
“帐户.彩票”=>“钱”,
“users.top.money”=>“money”,
'帐户'=>'帐户'),
'mail.inbox'=>'mail',
'mail.sentbox'=>'mail',
'mail.trash'=>'mail',
'公告.帖子'=>'邮件',
'公告.我的'=>'邮件',
“公告”=>“邮件”,
);
$current=$map_pages_to_navitem[$page_name];
echo“
  • ”; echo“
  • ”; echo“
  • ”; echo“
  • ”; echo“
  • ”; echo“
  • ”; echo“
  • ”;
  • 查看代码,我还看到最终结果是在
  • 元素上分配一个class属性值。JavaScript将比PHP做得更好

    因此,您可以给每个
  • 一个id,并将class属性的赋值留给JavaScript:

    echo '<li id="home"><a href=""><em>Home</em></a></li>';
    echo '<li id="users"><a href=""><em>Users</em></a></li>';
    echo '<li id="forum"><a href=""><em>Forum</em></a></li>';
    echo '<li id="more"><a href=""><em>More</em></a></li>';
    echo '<li id="money"><a href=""><em>Money</em></a></li>';
    echo '<li id="account"><a href=""><em>Account</em></a></li>';
    echo '<li id="mail"><a href=""><em>Mail</em></a></li>';
    
    echo '<script type="text/javascript">';
        echo 'document.getElementById("'.$current.'").className = "current";';
              // you'll want to sanitize $current to avoid parse errors in your JS
    echo '</script>'
    
    echo'
  • ; echo'
  • ; 回声“
  • ”; 回音“
  • ”; echo'
  • ; echo'
  • ; 回显“
  • ”; 回声'; echo'document.getElementById(“.$current.”)。className=“current”; //您需要清理$current以避免JS中的解析错误 回声“
    你应该尽量不要打印
  • 或类似的东西;看起来很乱。我已将检查此页面是否是要突出显示的页面移动到一个单独的功能,以防您最终更改
    $applicative\u list
    的布局

    <?php
    function active_header($page) {
        $applicable_list = array(
            "home" => array("home"),
            "users" => array(
                "users.online", "users.online.male", "users.online.female", "users.online.friends", 
                "users.location", "users.featured", "users.new", "users.browse", "users.search", "users.staff"
            ), 
            "forum" => array("forum"),
            "more" => array("widgets", "news", "promote", "development", "bookmarks", "about"),
            "money" => array("account.money", "account.store", "account.lottery", "users.top.money"),
            "account" => array("account"),
            "mail" => array("mail.inbox", "mail.sentbox", "mail.trash", "bulletins.post", "bulletins.my", "bulletins")
        );
        $pages = array_keys($applicable_list);
    
        function is_active_page($page, $category, $category_pages_list) {
            return array_key_exists($category, $category_pages_list) && in_array($page, $category_pages_list[$category]);
        }
        foreach($pages as $key => $category) {
            printf('<li%s><a href="#"><em>%s</em></a></li>' . "\n", 
                (is_active_page($page, $category, $applicable_list) ? ' class="current"' : ''),
                ucwords($category)
            );
        }
    }
    
    ?>
    

    不妨投我的一票。输出限制为与原始问题中给出的匹配

    <?PHP
    
    active_header('page identifier goes here'); //ie; 'home' or 'users.online'
    
    function active_header($page_name)
    {
        // Unified array
        $headers = array(
            'Home' => array('home' => true),
            'Users' => array(
                'users.online' => true,
                'users.online.male' => true, 
                'users.online.female' => true, 
                'users.online.friends' => true, 
                'users.location' => true, 
                'users.featured' => true, 
                'users.new' => true, 
                'users.browse' => true, 
                'users.search' => true, 
                'users.staff' => true
            ),
            'Forum' => array('forum' => true),
            'More' => array(
                'widgets' => true, 
                'news' => true, 
                'promote' => true, 
                'development' => true, 
                'bookmarks' => true, 
                'about' => true
            ),
            'Money' => array(
                'account.money' => true, 
                'account.store' => true, 
                'account.lottery' => true, 
                'users.top.money' => true
            ),
            'Account' => array('account' => true),
            'Mail' => array(
                'mail.inbox' => true, 
                'mail.sentbox' => true, 
                'mail.trash' => true, 
                'bulletins.post' => true, 
                'bulletins.my' => true, 
                'bulletins' => true
            )
        );
    
        foreach($headers as $header => &$pages) {
            echo '<li class="';
            if(isset($pages[$page_name])) echo 'content';
            echo '"><a href=""><em>', $header, '</em></a></li>';
        }            
    
    }
    
    ?>
    
    
    
    我不喜欢把代码和输出混为一谈,但举个例子,我会的


    PHP每日提示:如果只是回显字符串,请不要使用字符串连接

    我看不到任何令人信服的理由来更改原始代码。它很容易阅读和理解,并且很容易修改。我也不认为有任何理由使用Javascript来设置选项卡指示器。通过使用PHP,您可以满足禁用javascript的人的需求,我喜欢保存javascript以备真正需要。

    如果不从“打印HTML代码”更改为“返回HTML代码”,我至少会为此添加第二个参数。

    如果可能,请尝试将代码块包装为80(或120)个字符。这使得在线浏览变得非常困难,而且不得不修复一些你应该做的事情也非常烦人。从代码维护和可读性的角度来看,如果你一开始就这样编写代码,这也很好。@hobodave我看这很容易,谢谢如果你仔细看,
    开关正在检查是否设置了各种不同的数组,
    switch
    仅在检查同一变量的多个不同值时有效。
    swith(true){case$var1=='value':/*执行某些操作*/break;case$var2=='value':/*执行某些操作*/break;}
    但是,id确实错过了捕获的内容,因此与if/else相比,这没有什么优势。。还是有可能的:-)我不同意;使用变量无助于使代码更可读或更容易理解。我同意我的错误。彼得爪方案更好。谢谢。
    in_array
    对数组进行线性搜索,而
    isset
    只检查索引。简而言之,在数组中使用
    比使用
    isset
    慢。这是变量的一个很好的例子。就我个人而言,我认为解决方案不在于增加阵列。我发现最底层的代码可能是他到目前为止最清晰的。很好,我甚至不知道你可以在这样的函数中定义一个函数!我正在尝试您的示例,但在调用is_active_page()的第6行有一个错误,我如何设置
    <?PHP
    
    active_header('page identifier goes here'); //ie; 'home' or 'users.online'
    
    function active_header($page_name)
    {
        // Unified array
        $headers = array(
            'Home' => array('home' => true),
            'Users' => array(
                'users.online' => true,
                'users.online.male' => true, 
                'users.online.female' => true, 
                'users.online.friends' => true, 
                'users.location' => true, 
                'users.featured' => true, 
                'users.new' => true, 
                'users.browse' => true, 
                'users.search' => true, 
                'users.staff' => true
            ),
            'Forum' => array('forum' => true),
            'More' => array(
                'widgets' => true, 
                'news' => true, 
                'promote' => true, 
                'development' => true, 
                'bookmarks' => true, 
                'about' => true
            ),
            'Money' => array(
                'account.money' => true, 
                'account.store' => true, 
                'account.lottery' => true, 
                'users.top.money' => true
            ),
            'Account' => array('account' => true),
            'Mail' => array(
                'mail.inbox' => true, 
                'mail.sentbox' => true, 
                'mail.trash' => true, 
                'bulletins.post' => true, 
                'bulletins.my' => true, 
                'bulletins' => true
            )
        );
    
        foreach($headers as $header => &$pages) {
            echo '<li class="';
            if(isset($pages[$page_name])) echo 'content';
            echo '"><a href=""><em>', $header, '</em></a></li>';
        }            
    
    }
    
    ?>