Tengo 4 puntos de datos que pueden existir para un artículo en particular. Existente se define como tener un valor de "Y". Aquí están las 4 cosas:

INST_UNIV
INST_4YEAR
INST_2YEAR
INST_VOTECH

Lo que me gustaría hacer es recorrerlos y, si cada uno tiene un valor de "Y", mostrar el texto asociado. Finalmente, si el número es mayor que 1, me gustaría que estén separados por comas con "o" antes del último elemento. Aquí está el lío de código con el que he estado jugando. Funciona, pero debido a que la matriz está codificada, incluso si una de las variables devuelve un valor vacío, la coma todavía se muestra. Cualquier ayuda es apreciada.

<li>
Must attend: 
  @php
    $univ = ( $instance->applicationCharacteristics->first()->INST_UNIV == 'Y')? "a university" : "";
    $fourYear = ( $instance->applicationCharacteristics->first()->INST_4YEAR == 'Y')? "a four-year college" : "";
    $twoYear = ( $instance->applicationCharacteristics->first()->INST_2YEAR == 'Y')? " two-year college" : "";
    $voTech = ( $instance->applicationCharacteristics->first()->INST_VOTECH == 'Y')? "a vocational-tech school" : "";
    $items = array("$univ", "$fourYear", "$twoYear", "$voTech");
    $items[count($items) - 1] = "or " . $items[count($items) - 1];
    $items_string = implode(", ", $items );
    echo $items_string;
  @endphp
</li>
0
Adam Robertson 14 sep. 2018 a las 01:10

3 respuestas

La mejor respuesta

Intenta algo como esto en su lugar. Solo inserta valores en la matriz $items si necesitan estar allí. Luego implosiona la primera parte de la matriz con separadores de coma y agrega " or " antes del último elemento.

$items = array();
if ( $instance->applicationCharacteristics->first()->INST_UNIV == 'Y') $items[] = "a university";
if ( $instance->applicationCharacteristics->first()->INST_4YEAR == 'Y') $items[] = "a four-year college";
if ( $instance->applicationCharacteristics->first()->INST_2YEAR == 'Y') $items[] = "two-year college";
if ( $instance->applicationCharacteristics->first()->INST_VOTECH == 'Y') $items[] = "a vocational-tech school";
if (count($items) > 1)
    $items_string = implode(', ', array_slice($items, 0, -1)) . " or " . $items[count($items)-1];
else
    $items_string = $items[0];
echo $items_string;  
1
Nick 13 sep. 2018 a las 22:38

Simplemente use la función substr para eliminar el último "," eliminando los dos últimos caracteres:

$items_string = substr(implode(", ", $items ),0,-2);
0
Don't Panic 13 sep. 2018 a las 23:03

Podrías procesar un poco las matrices y combinarlas usando una declaración condicional:

$univ = ( $instance->applicationCharacteristics->first()->INST_UNIV == 'Y')? "a university" : "";
$fourYear = ( $instance->applicationCharacteristics->first()->INST_4YEAR == 'Y')? "a four-year college" : "";
$twoYear = ( $instance->applicationCharacteristics->first()->INST_2YEAR == 'Y')? " two-year college" : "";
$voTech = ( $instance->applicationCharacteristics->first()->INST_VOTECH == 'Y')? "a vocational-tech school" : "";
$items = array("$univ", "$fourYear", "$twoYear", "$voTech");
$items = array_filter($items); // remove empty arrays
$or = count($items) > 1 ? ' or ' : ''; // only add 'or' if items is more than one
$last_item = array_pop($items); // get the last items
$items_string = implode(", ", $items ) . $or . $last_item;
echo $items_string;
0
Hasta Dhana 13 sep. 2018 a las 22:43