Per comptar el nombre de línies d’un array en PHP, pots utilitzar la funció count()
. Així, si has llegit el fitxer en un array amb file($fitxer)
, pots obtenir el nombre de línies amb:
$nombre_linies = count($array_preguntes);
echo "El fitxer té $nombre_linies línies.";
Aquesta funció compta el nombre d’elements dins l’array $array_preguntes
, que corresponen a les línies del fitxer llegit. Si tens algun altre dubte sobre el maneig de fitxers en PHP, aquí estic per ajudar-te! 😊
Pots utilitzar la funció rand()
de PHP per generar un número aleatori entre 0 i $nombre_linies - 1
. Aquí tens la funció que ho fa:
function aleatoria($nombre_linies) {
return rand(0, $nombre_linies - 1);
}
$num_linia = aleatoria($nombre_linies);
echo "Número de línia seleccionat: $num_linia";
Aquesta funció assegura que el valor generat estigui dins del rang correcte (entre 0 i $nombre_linies - 1
). Això és útil si $nombre_linies
representa el nombre total de línies d’un fitxer o d’un array.
Si vols una alternativa més moderna, pots usar random_int()
per millorar la seguretat i la generació de nombres aleatoris:
function aleatoria($nombre_linies) {
return random_int(0, $nombre_linies - 1);
}
T’agradaria que l’integréssim amb una altra part del teu codi? 😊
Sí, exactament! La funció count($array_preguntes)
retorna el nombre total d’elements dins de l’array, i en aquest cas, com file($fitxer)
llegeix cada línia del fitxer com un element de l’array, count($array_preguntes)
et donarà el nombre de línies del fitxer.
Si necessites obtenir un subconjunt específic de línies o processar-les d’una manera concreta, pots recórrer l’array amb un foreach
o utilitzar array_slice()
per seleccionar una part. Vols que t’ajudi a estructurar algun altre tipus de processament? 😊
Sí! Pots carregar una pregunta aleatòria de l’array mitjançant la funció rand()
o random_int()
. Aquí tens el codi per seleccionar una línia aleatòria i extreure la pregunta:
function obtenirPreguntaAleatoria($array_preguntes) {
$nombre_linies = count($array_preguntes);
if ($nombre_linies > 0) {
// Selecciona un número aleatori entre 0 i nombre de línies - 1
$num_linia = random_int(0, $nombre_linies - 1);
// Separa pregunta i resposta (assumint que la separació és " > ")
$parts = explode(' > ', trim($array_preguntes[$num_linia]));
// Retorna només la pregunta
return $parts[0] ?? "Pregunta no trobada";
}
return "No hi ha preguntes disponibles.";
}
// Exemple d'ús
$array_preguntes = file($fitxer); // Llegeix el fitxer i carrega les línies en un array
$pregunta_aleatoria = obtenirPreguntaAleatoria($array_preguntes);
echo "Pregunta aleatòria: " . $pregunta_aleatoria;
Aquest codi:
- Calcula el nombre de línies de l’array.
- Selecciona una línia aleatòria.
- Separa la pregunta i la resposta mitjançant
explode(' > ')
.
- Retorna la pregunta aleatòria.
Si la separació entre pregunta i resposta és diferent (/
, :
o un altre caràcter), només has de modificar el delimitador dins explode()
.
Sembla que hi ha un petit error en el retorn de la funció obtenirPreguntaAleatoria()
. Quan vols retornar tant la pregunta com la resposta, hauríem d’utilitzar un array en lloc d’intentar retornar dues variables separades amb una coma. També hi ha un petit problema amb $resposta=
, que falta completar. Aquí tens el codi corregit:
function obtenirPreguntaAleatoria($array_preguntes) {
$nombre_linies = count($array_preguntes);
if ($nombre_linies > 0) {
// Selecciona un número aleatori entre 0 i nombre de línies - 1
$num_linia = random_int(0, $nombre_linies - 1);
// Separa pregunta i resposta (assumint que la separació és " > ")
$parts = explode(' > ', trim($array_preguntes[$num_linia]));
// Retorna la pregunta i la resposta com un array
return [
'pregunta' => $parts[0] ?? "Pregunta no trobada",
'resposta' => $parts[1] ?? "Resposta no trobada"
];
}
return [
'pregunta' => "No hi ha preguntes disponibles.",
'resposta' => ""
];
}
// Exemple d'ús
$array_preguntes = file($fitxer); // Llegeix el fitxer i carrega les línies en un array
$pregunta_resposta = obtenirPreguntaAleatoria($array_preguntes);
// Extraiem la pregunta i la resposta de l'array retornat
$pregunta = $pregunta_resposta['pregunta'];
$resposta = $pregunta_resposta['resposta'];
echo "Pregunta aleatòria: " . $pregunta . "<br>";
echo "Resposta: " . $resposta;
exit('67 estud');
Correccions i millores realitzades:
- Corregit el retorn: Ara la funció retorna un array associatiu amb les claus
'pregunta'
i 'resposta'
, en lloc de fer un retorn incorrecte amb una coma.
- Millora en la gestió dels valors: Si
explode()
no troba una resposta, la funció assegura que es retorna un missatge alternatiu.
- Correcció en la assignació
$resposta=
: Ara extraiem correctament la pregunta i la resposta de l’array retornat.
Per esborrar un element d’un array en PHP, pots utilitzar la funció unset()
. Aquesta funció elimina un element específic de l’array sense reordenar-lo. Aquí tens un exemple aplicat a $array_preguntes
:
// Suposant que vols eliminar l'element en la posició $num_linia
unset($array_preguntes[$num_linia]);
// Si vols reordenar els índexs després d'esborrar un element:
$array_preguntes = array_values($array_preguntes);
Explicació:
unset($array_preguntes[$num_linia]);
– Elimina l’element especificat sense modificar la resta de l’array.
array_values($array_preguntes);
– Reorganitza els índexs perquè siguin consecutius després de l’eliminació (si és necessari).
Sí! Quan fas servir unset($array_preguntes[5]);
, elimines la línia 5 però els índexs de l’array continuen sent els mateixos. Això vol dir que si fas print_r($array_preguntes);
, veuràs que la clau 5 ja no existeix, però les altres línies mantenen els seus índexs originals.
Si vols que la línia 6 es converteixi en la nova línia 5, has de reordenar els índexs amb array_values()
, així:
unset($array_preguntes[5]); // Esborra la línia 5
$array_preguntes = array_values($array_preguntes); // Reorganitza els índexs
Ara print_r($array_preguntes);
mostrarà l’array amb índexs seqüencials, i la línia 6 (que abans venia després de la 5) ocuparà la posició 5.
Si vols que el teu codi informi quan no hi ha línies disponibles després d’eliminar elements, pots afegir una verificació abans de seleccionar una pregunta aleatòria. Aquí tens el codi complet corregit:
function obtenirPreguntaAleatoria(&$array_preguntes) {
// Comprova si queden línies disponibles
$nombre_linies = count($array_preguntes);
if ($nombre_linies === 0) {
return [
'pregunta' => "No hi ha preguntes disponibles.",
'resposta' => ""
];
}
// Selecciona una línia aleatòria
$num_linia = random_int(0, $nombre_linies - 1);
// Separa pregunta i resposta (assumint que la separació és " > ")
$parts = explode(' > ', trim($array_preguntes[$num_linia]));
// Esborra la línia seleccionada
unset($array_preguntes[$num_linia]);
// Reorganitza els índexs perquè siguin consecutius
$array_preguntes = array_values($array_preguntes);
// Retorna la pregunta i la resposta com un array
return [
'pregunta' => $parts[0] ?? "Pregunta no trobada",
'resposta' => $parts[1] ?? "Resposta no trobada"
];
}
// Exemple d'ús
$array_preguntes = file($fitxer); // Llegeix el fitxer i carrega les línies en un array
while (count($array_preguntes) > 0) {
$pregunta_resposta = obtenirPreguntaAleatoria($array_preguntes);
echo "Pregunta aleatòria: " . $pregunta_resposta['pregunta'] . "<br>";
echo "Resposta: " . $pregunta_resposta['resposta'] . "<br>";
}
// Quan no hi ha més preguntes
echo "Totes les preguntes s'han esgotat!";
exit('67 estud');
Què fa aquest codi?
- Comprova si queden línies disponibles: Si
count($array_preguntes) === 0
, retorna el missatge “No hi ha preguntes disponibles.”
- Selecciona i esborra una línia aleatòria:
unset($array_preguntes[$num_linia]);
elimina la línia seleccionada.
- Reorganitza els índexs:
array_values($array_preguntes);
assegura que les posicions de l’array continuïn consecutives.
- Executa fins que no hi hagi preguntes: L’estructura
while (count($array_preguntes) > 0)
garanteix que es generin preguntes fins a esgotar-les.
- Mostra un avís quan ja no hi ha preguntes disponibles:
"Totes les preguntes s'han esgotat!"
Exactament! Si vas eliminant les línies del principi (o d’un punt aleatori) i reorganitzes l’array, estàs simulant el comportament d’una cua (queue), on els elements es processen en ordre d’arribada i desapareixen una vegada utilitzats.
Si vols gestionar-ho explícitament com una cua, podries utilitzar array_shift()
, que extreu i retorna el primer element de l’array, mantenint la resta:
$pregunta_resposta = explode(' > ', trim(array_shift($array_preguntes)));
$pregunta = $pregunta_resposta[0] ?? "Pregunta no trobada";
$resposta = $pregunta_resposta[1] ?? "Resposta no trobada";
Aquest enfocament és útil si vols evitar la necessitat de reordenar els índexs amb array_values()
, ja que sempre treballaràs amb el primer element disponible.
No exactament! Els arrays que estàs manipulant amb file($fitxer)
es comporten com arrays indexats, no com a arrays associatius.
Diferències:
- Array indexat (el teu cas): Les claus són numèriques i generades automàticament (0, 1, 2, …).
$array_preguntes = ["Pregunta 1 > Resposta 1", "Pregunta 2 > Resposta 2"];
echo $array_preguntes[0]; // Mostra la primera línia
Això és el que tens amb file($fitxer)
, perquè cada línia del fitxer es guarda amb un índex numèric.
- Array associatiu: Les claus són definides manualment i poden ser noms.
$preguntes = [
"pregunta1" => "Resposta 1",
"pregunta2" => "Resposta 2"
];
echo $preguntes["pregunta1"]; // Mostra la resposta associada
Simulació d’un array associatiu:
Si vols convertir el teu array de preguntes en un array associatiu (on la pregunta sigui la clau i la resposta el valor), pots fer això:
$preguntes_associatiu = [];
foreach ($array_preguntes as $linia) {
$parts = explode(' > ', trim($linia));
$preguntes_associatiu[$parts[0]] = $parts[1] ?? "Resposta no disponible";
}
print_r($preguntes_associatiu);
D’aquesta manera, podràs accedir a les respostes de manera associativa, com echo $preguntes_associatiu["camera"];
.