Estoy tratando de imprimir diferentes campos de la matriz $data si existen usando switch / case.

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

Lo que estoy tratando de hacer:

<?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;

Etcetera.

¡Gracias! El problema es que no se muestra nada, pero cuando escribo, por ejemplo, <?=$data['type']?> fuera del interruptor / caso, se muestra.

php
3
szeejdi 9 sep. 2018 a las 11:40

3 respuestas

La mejor respuesta

El problema es que su código está tratando de usar una matriz de valores múltiples como una variable única.

Debe hacer un foreach para analizar todas las variables de matriz y luego puede usar un interruptor para obtener cada valor (título, tipo, etc.) y devolver el HTML que necesita.

Prueba con esto:

<?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;
  }
}
3
Oscargeek 9 sep. 2018 a las 11:28

En su caso, trabajando con foreach de PHP debe verificar el actual clave del elemento, asignada a la variable $key en cada iteración.

foreach (array_expression as $key => $value)
    statement

También agregó algún refactor para evitar el código duplicado en su secuencia de comandos.

Ejemplo de código:

<?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
Yosvel Quintero Arguelles 9 sep. 2018 a las 11:45

Si el único criterio de calificación es un conjunto conocido de claves, entonces puede filtrar los elementos que no desea según una lista blanca de claves. Luego use un bucle foreach para hacer eco solo de los datos de la lista blanca. Si no hay elementos calificativos, no se invocarán ecos.

Ventajas aparentes:

  • la matriz de la lista blanca hace que la solución sea muy escalable en caso de que desee ajustar los datos que desea mostrar
  • prefiltrar los datos significa que el bucle foreach nunca itera datos sin mostrar datos.
  • las líneas de eco son D.R.Y. (No te repitas); Esto mantiene su código limpio, conciso y fácil de administrar

Código: (Demo)

$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>";
}

Salida:

<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>

Esta tarea se puede lograr de varias maneras dependiendo de los requisitos del proyecto. Incluso puede querer construir en más condiciones de filtro. Si desea tener más certeza acerca de cuál es la mejor técnica, deberá ofrecer más / mejores detalles sobre su proyecto.


Si no necesita una solución escalable, pero necesita manejar los datos de cada clave de forma individual / diferente, puede escribir llamadas isset() y hacer eco de su contenido sin ningún bucle (condicionales iterados).

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>";
}
2
mickmackusa 10 sep. 2018 a las 04:22