草庐IT

php - 无法在循环中选择表单选项

coder 2023-10-25 原文

我有一个将值存储到变量中的解析器(duh)。这里讨论的变量是:

$item[2]   <- contains the string 'facebook'

我有一个包含选择菜单的 html 表单。菜单是根据我的数据库中存储的内容动态填充的。这就是我的菜单的构建方式:

<?php
$formats = $wpdb->get_results($wpdb->prepare("
        SELECT * FROM table
        WHERE taxonomy = 'format'
        "));
?>

<div id="format" class="form">
    Format: <?php echo $item[2]; ?>  <!-- echoes the variable to know it works -->
    <?php
        $terms = array();              
        foreach($formats as $key => $term){
            $terms[$term->parent][$term->term_id] = $term;
        }
    ?>    
    <select name="formats">
        <option value="empty"></option>
        <?php printTerms($terms, $item); ?> <!--- THIS DOESN'T APPEAR TO PASS $item INTO THE FUNCTION -->
    </select>
</div>

<?php
function printTerms($terms, $item, $parent = 0, $deep = 0){ // HOW DO I USE $item ???
    if(count($terms[$parent]) > 0){
        $indent = "";
        for($i = 0; $i < $deep; $i++){
            $indent .= "&nbsp;&nbsp;&nbsp;";
        }

        foreach($terms[$parent] as $key => $term){
            if(count($terms[$term->term_id]) > 0){
                if($deep == 0){
                    echo "<option class='toplevel' value='".$term->name."' ".$selected.">".$term->name."</option>";   //     <- Outputs top level parents
                } else {
                    echo "<option class='child".$deep."' value='".$term->name."' ".$selected.">".$indent.$term->name."</option>";  // <- Outputs children that are also parents
                }

                printTerms($terms, $term->term_id, ($deep+1));

            } else {
                echo "<option class='solo' value='".$term->name."' ".$selected.">".$indent.$term->name."</option>";   // <- outputs bottom level children and solos.
            }
        }
    }
}
?>

到目前为止一切正常,但这是我的问题。

我想做的是,如果 items[2] 包含字符串“Facebook”(确实如此),则默认选择相应的菜单选项。

我确实让它在像这样的简单静态选择菜单中工作:

foreach ($formats as $format) {
    $selected = '';
            if ($item[2] == 'facebook' || $item[2] == 'wall' && $format->slug == 'facebook'){ 
        $selected = 'selected';
    }
    echo "<option value='".$format->name."' ".$selected.">".$format->name."</option>";
}

$format->slug 是包含我想要匹配到 $item[2] 的值。 因此,$term->slug 对应于 $format->slug。

$format->name 是输出到菜单本身的选择选项的标题。 同样,$term->name 对应于 $format->name。

$formats 访问这个 MySQL 表:

term_id       name           slug                 taxonomy     parent
1             Entry Form     entry-form           format       0
2             Page           page                 format       3
3             Facebook       facebook             format       0
4             Entry Form     facebook-entry-form  format       3
5             Twitter        twitter              format       0
6             Single        single                format       2

您会注意到我已经将 $selected 变量插入到我的函数中。我的问题是我无法让上面的代码在 printTerms 函数的上下文中工作。

就我的问题而言,假设任何变量中都没有空格(我检查过)。

需要牢记的一些规则:

$term->slug 和 $item[2] 并不总是匹配。如果 $item[2] 是 'wall',这也应该导致默认选择 'facebook'。 (见我上面的代码)。

所以问题是,如何将我的 printTerms() 函数与我的选择代码结合起来?

最佳答案

为了测试,我稍微修改了您的代码以在没有数据库的情况下工作。真正的“改变”是我修改了 count()使用 isset()相反。

细微的变化是选项现在以换行符分隔,函数不输出任何内容,而是返回输出。

由此生成的 HTML 确实在我的 Firefox 浏览器中显示为默认选择的“Facebook”。

(缩进,为了易读性删除了 </option>)

<html><body><select>
<option class='solo'     value='Entry Form'>Entry Form
<option class='toplevel' value='Facebook' selected="selected">Facebook
<option class='child1'   value='Page'      >   Page
<option class='solo'     value='Single'    >      Single
<option class='solo'     value='Entry Form'>   Entry Form
<option class='solo'     value='Twitter'   >Twitter
</select></body></html>

PHP测试用例如下:

<?php
        $formats = array(
                array('term_id' => 1, 'name' => 'Entry Form', 'slug' => 'entry-form', 'taxonomy' => 'format', 'parent' => 0),
                array('term_id' => 2, 'name' => 'Page', 'slug' => 'page', 'taxonomy' => 'format', 'parent' => 3),
                array('term_id' => 3, 'name' => 'Facebook', 'slug' => 'facebook', 'taxonomy' => 'format', 'parent' => 0),
                array('term_id' => 4, 'name' => 'Entry Form', 'slug' => 'facebook-entry-form', 'taxonomy' => 'format', 'parent' => 3),
                array('term_id' => 5, 'name' => 'Twitter', 'slug' => 'twitter', 'taxonomy' => 'format', 'parent' => 0),
                array('term_id' => 6, 'name' => 'Single', 'slug' => 'single', 'taxonomy' => 'format', 'parent' => 2),
        );

        $terms = array();
        foreach($formats as $term){
                $a = $term['parent'];
                $b = $term['term_id'];
            $terms[$a][$b] = $term;
        }

        function printTerms($terms, $parent = 0, $deep = 0, $item){
        $output = '';
    if(count($terms[$parent]) > 0){
        $indent = "";
        for($i = 0; $i < $deep; $i++){
            $indent .= "   ";
        }

        foreach($terms[$parent] as $key => $term)
        {
            $selected = ($item == $term['slug']) ? ' selected="selected"' : '';
            if(isset($terms[$term['term_id']]))
            {
                if($deep == 0){
                    $output .= "<option class='toplevel' value='".$term['name']."'".$selected.">".$term['name']."</option>";   //     <- Out
puts top level parents
                } else {
                    $output .= "<option class='child".$deep."' value='".$term['name']."'".$selected.">".$indent.$term['name']."</option>";
// <- Outputs children that are also parents
                }
                $output .= "\n";
                $output .= printTerms($terms, $term['term_id'], ($deep+1), $item);

            } else {
                $output .= "<option class='solo' value='".$term['name']."'".$selected.">".$indent.$term['name']."</option>";   // <- outputs
 bottom level children and solos.
                $output .= "\n";
            }
        }
    }
        return $output;
}

        print "<html><body><select>";
        print printTerms($terms, 0, 0, 'facebook');
        print "</select></body></html>";

?>

更新:我们可以在之前的 printTerms 的基础上进行构建函数进行更灵活的匹配。

首先我们重命名printTerms()printTermsBase()我们从中删除了所有对选项选择的引用。输出将是一堆形式的行

 <option class='something' value='somethingelse'>text</option>

现在我们可以对输出运行文本匹配。下面的函数,当传入“wall”时,会选择“wall”;如果没有“wall”,它将选择“facebook”;如果那也不存在,它将不选择任何内容。您可以反转数组以便选择“wall”,除非 facebook 存在。文本匹配是精确的:“facebook-form”将被忽略。如果你想为“facebook-form”匹配“facebook”,你需要使用 preg*功能。

 function printTerms($terms, $item)
 {
     $items = array($item, 'facebook');
     $options = printTermsBase($terms, 0, 0);
     foreach($items as $raw)
     {
         // We could use preg_match here for even greater flexibility
         $search="value='$raw'";
         if (false === strpos($options, $search))
             continue;
         // One of the option matches.
         // We just replace    value='something'
         // with               value='something' selected='selected'
         return str_replace($search, $search.' selected="selected"', $options);
     }
     // No match. Return options unchanged.
     return $options;
 }

关于php - 无法在循环中选择表单选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271028/

有关php - 无法在循环中选择表单选项的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  3. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  10. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

随机推荐