Afisare random cu conditia de existenta

Vreau sa afisez la intamplare un singur joc asa ca am facut asta:

$randomjoc = array('ballgame', 'cargame', 'planegame');
$play = $randomjoc[rand(0, count($randomjoc)-1)];
echo $play;

Cum as putea sa verific daca jocurile sunt active ?

$config['joc1']
$config['joc2']
$config['joc4']

Contine valoarea 1 sau 0

Am incercat chestia asta dar primesc Parse error : syntax error, unexpected ‘if’ (T_IF),

$randomjoc = array(if ($config['joc1']) {'ballgame'}, 'cargame', 'planegame');

Pentru ca ai o eroare de sintaxa. Iti spune clar care este problema

In array nu poti sa pui if sau alte instructiuni. Doar valori.

Dacă înțeleg bine, tu vrei să iei un element din array aleatoriu:

https://www.php.net/manual/en/function.array-rand.php

da, dar vreau sa il iau cu o conditie
sa iau ballgame doar daca $config[‘joc1’] == 1

Populezi array ul dupa ce verifici jocurile active :D. Sau faci un array de array-uri, le filtrezi dupa care faci random pe rezultatul filtrat. Descrie un pic mai bine problema, poate se fac improvements si la structurile de date

Eu nu înțeleg ce relație este între $config['joc1'] și array('ballgame', 'cargame', 'planegame');.

Poate că ai omis ceva detalii?

1 Like

Dacă explicai care e legătura dintre array-ul $config și jocurile din array, cred că primeai răspunsul până acum.

Nici 0 și 1 nu știm de unde vine…

Nu este nici o relatie.
Vreau sa obtin la intamplare unul din cele 3 jocuri
Dar daca $config[‘joc’] este 0 si nu este 1 sa nu mai obtin ballgame ci unul din cele 2 cargame sau planegame
Sau daca $config[‘joc2’] este 0 si nu este 1 sa nu mai obtin cargame ci unul din cele 2

Va să zică array-ul $config conține statusul jocurilor… ?

Dacă răspunsul este da, crorect ar fi fost ca și jocurile să se găsească în acel $config.

$config = [
	[
		'joc' => 'Jocul numărul 1',
		'status' => 1,
	],
	[
		'joc' => 'Jocul numărul 2',
		'status' => 0,
	],
	[
		'joc' => 'Jocul numărul 3',
		'status' => 1,
	],
];
foreach($config as $key => $value)
{
	if($value['status'] === 0)
	{
		unset($config[$key]);
	}
}
$joc = $config[array_rand($config)];

spune daca e activ sau inactiv se poate inlocui cu
$joc1 = 1; sau $joc1 = 0;

Offtopic: ce creativ, nu m-aş fi gândit niciodată să folosesc condiţie la iniţializarea unui array :slight_smile: Faza a că e chiar posibilă chestia asta, într-un fel, folosind operatorul ternar.

De genul asta:

$randomjoc = array_filter(array($joc1 == 1 ? 'ballgame' : null, 'cargame', 'planegame'));

Ontopic: Evident, soluţia de mai sus este funcţională, dar dacă ai nevoie de chestia aia, clar e ceva profund greşit în abordarea ta. Cum determini care jocuri sunt disponibile? De ce nu creezi array-ul direct în momentul determinării statusului lor?

LATER EDIT: interesant sintactic sugar adăugat în php 7, se poate folosi null coalescing operator:

$randomjoc = array_filter(array($joc1 == 1 ?? 'ballgame', 'cargame', 'planegame'));
1 Like

false !== null, nu merge cu ??

Păi uite că este o relație, din moment ce vrei să afișezi ceva în funcție de altceva

Nevermind, ai dreptate, am gândit pe dos :slight_smile: Căutam de fapt un shortcut pentru “if true then value else null”. null coalescing operator face pe dos, “if null then default value”.

1 Like

Nu cred ca e o idee bună să modifici un Array într-ul loop peste același Array. Mai ales când pentru începători :slight_smile:

Pentru ce ai făcut acolo există array_filter.

1 Like

Eu fac asta frecvent atât timp cât nu-mi propun să mai folosesc cheia/valoarea respectivă.

Da, se poate face și cu array_filter.

Nu am reusit asa ca am facut o baza de date mysql.

function get_games() { 
    global $dataBase, $config;

    $sql = $dataBase->prepare('SELECT pr__games.id, pr__games.name, pr__games.value, pr__games.played_times, pr__games.description
                               FROM pr__games
                               WHERE pr__games.value = 1 ORDER BY pr__games.name DESC');
    $sql->execute();
	$games = $sql->fetchAll();
    $sql->closeCursor();
	return $games; 
}
$return_value = get_games();

foreach ($return_value as $row) {
	$randomjoc = array($row['name']);
}	

$play = $randomjoc[rand(0, count($randomjoc)-1)];

echo $play;

Imi afiseaza acelasi joc de fiecare data.
Unde am gresit?

Boss, fa si tu niste debugging pe acolo. Ca nu-i asa de greu.

Ce iti returneaza acel query?
Cate randuri iti returneaza? Ca daca este un rand, nu ai ce sa faci cu random.

Pooti sa iei random si din baza de date

De ce nu folosesti array_rand?
Nu lucrez cu php, dar pare ca face ce trebuie.

https://www.php.net/manual/ro/function.array-rand.php
Ai in primul comentariu un exemplu de folosire.

1 Like

Poate sa ii returneze si un infinit de randuri ca are $randomjoc = array($row[‘name’]); ceea ce ii suprascrie variabila la fiecare iteratie in loc sa adauge un element in array. asta ca sa nu mai spun despre restul de probleme.

$randomjoc = $row[‘name’]; //adauga la coada array-ului un element nou

Initializeaza arrayul undeva inainte: $randomjoc = ;

Cred că ne luptăm oricum cu morile de vânt, omul vrea neapărat să inventeze dialectul lui de php :slight_smile:

Serios vorbind, nu trebuie niciun array, se poate extrage direct din MySQL un rand aleator, doar pui la sfârşit ORDER BY RAND() LIMIT 1 şi ai terminat povestea.

1 Like