使用PHP在switch case语句中打印数组

3

我正在尝试使用switch/case打印$data数组中存在的不同字段。

Array ( [title] => title [type] => Movie [hour] => [dayoftheweek] => 5 [dayofthemonth] => )

我想要做什么:

<?php
switch($data):
    case 'title': 
        ?>
        <div class="col-md-4">
            <div class="name-value" id="title"><?=$data['title']?></div>
        </div>
        <?php
    break;
    case 'type': 
        ?>
        <div class="col-md-4">
            <div class="name-value" id="type"><?=$data['type']?></div>
        </div>
        <?php
    break;
endswitch;

谢谢!问题是没有任何内容被显示,但是当我在switch/case之外输入<?=$data['type']?>时,它会显示出来。

2
switch($data) 没有意义。现在你正在将 $data(它是一个数组)与字符串 'title' 进行比较。 - Jeff
2
也许你想要这样写 if(isset($data['title'])) { // 输出标题 } ? - Jeff
1
你是想要所有内容都打印出来,只是使用不同的 id="title" 吗? - Jeff
1
请使用我的第二条评论! - Jeff
2
foreach ($data as $key => $value) { switch($key) ... } - Cid
显示剩余8条评论
3个回答

3
问题在于你的代码尝试使用多个值的数组作为一个唯一的变量。你需要使用foreach循环来解析所有数组变量,然后可以使用switch语句获取每个值(标题、类型等),并返回所需的HTML。请尝试使用以下代码:
<?php 
/* Parse all values */
foreach ($data as $key => $value) {
  /* Parse all variables in each value */
  switch($key) {
    case 'title':
      ?>
        <div class="col-md-4">
          <div class="name-value" id="title"><?=$value?></div>
        </div>
      <?php
      break;
    case 'type':
      ?>
        <div class="col-md-4">
          <div class="name-value" id="type"><?=$value?></div>
        </div>
      <?php
      break;
  }
}

2
如果唯一的资格标准是已知的一组键,则可以根据白名单键过滤掉不需要的元素。然后使用foreach循环仅回显白名单数据。如果没有合格的元素,则不会调用任何回声。
明显的优点:
- 白名单数组使解决方案在您希望调整要显示的数据时非常可扩展。 - 预过滤数据意味着foreach循环永远不会迭代未显示数据。 - 回声行是DRY(不要重复自己)的;这使得您的代码清洁,简洁且易于管理。
代码:(演示
$data = ['title' => 'The Title', 'type' => 'Movie', 'hour' => '', 'dayoftheweek' => 5, 'dayofthemonth' => ''];
$whitelist = ['title' => '', 'type' => ''];
$filtered = array_intersect_key($data, $whitelist);
// var_export($filtered);  // uncomment if you want to see what remains

foreach($filtered as $key => $value) {
    echo "<div class=\"col-md-4\">";
        echo "<div class=\"name-value\" id=\"$key\">$value</div>";
    echo "</div>";
}

输出:

<div class="col-md-4">
    <div class="name-value" id="title">The Title</div>
</div>
<div class="col-md-4">
    <div class="name-value" id="type">Movie</div>
</div>

这项任务的实现方式因项目需求而异。您甚至可以构建更多过滤条件。如果您想更确定哪种技术是最佳选择,那么您需要提供更多/更好的关于您的项目的详细信息。
如果您不需要可扩展的解决方案,但需要单独/不同地处理每个键的数据,则可以编写isset()调用并输出内容,而无需使用任何循环(迭代条件)。
if (isset($data['title'])) {
    echo "<div class=\"col-md-6\">";
        echo "<div class=\"unique123\" id=\"movie_title\">{$data['title']}</div>";
    echo "</div>";
}
if (isset($data['type'])) {
    echo "<div class=\"col-md-4\">";
        echo "<div class=\"type_group\" id=\"type\">{$data['type']}</div>";
    echo "</div>";
}

我不知道是谁在对我的采用最佳实践的答案进行负面评价。被接受的解决方案不够DRY,容易运行无意义的迭代。 - mickmackusa

1
在您的情况下,使用 PHP 的 foreach 循环时,您需要在每次迭代中检查当前元素的键,该键被分配给变量 $key
foreach (array_expression as $key => $value)
    statement

也添加了一些重构来避免您的脚本中出现重复的代码。
代码示例:
<?php 
foreach ($data as $key => $value) {
  if (in_array($key, ['title', 'type'])) {
    echo '<div class="col-md-4">';
      echo '<div class="name-value" id="' . $key . '">' . $value . '</div>';
    echo '</div>';
  }
}

1
该答案“遭受”了潜在的过多迭代。即使成功显示了titletype数据,循环仍然继续工作。(不是最佳实践) - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接