Cum functioneaza foreach() si Array

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
sterica
Mesaje: 268

Cum functioneaza foreach() si Array

MarPlo, ajuta-ma te rog sa inteleg cum functioneaza foreach-ul meu, din cat am reusit sa invat pana acum, foreach-ul stiu ca arata sub forma aceasta:

Cod: Selectaţi tot

//trebuie sa am un array de forma aceasta
	$insert =array ("id1", "id2", "id3");
	
//iar foreach-ul:
foreach ($insert as $value) {
	echo $value. <br/>;
}
// pe care il traduc partial (ca nu stiu mai mult): pentru fiecare valoarea din array-ul insert o aloc variabilei $value?
In schimb foreach-ul meu nu il inteleg nici macar partial:

Cod: Selectaţi tot

//am un array gol
$insert = [];
	
//iar foreach-ul, sfideaza legea gravitatiei
foreach($_POST['id_nota'] as $id=>$nota) $insert[] ='('. $id .', '. $nota .", '". $intrebarea ."', '" . $_POST['sugestie'][$id] ."')";
Multumesc!

MarPlo
Salut
Forma generala a instructiunii foreach() este:

Cod: Selectaţi tot

//a simple array
$arr =['k1'=>'v1', 'k2'=>'v2', 'k3'=>'v3'];
	
//foreach traverses the keys and their values in $arr
foreach($arr as $key=>$value) {
  echo $key .' - '. $value .'<br>';
}
- $key si $value pot avea orice denumire de variabila, vor reprezenta acelasi lucru.
In foreach-ul din codul tau:

Cod: Selectaţi tot

//un array gol
$insert = [];
	
foreach($_POST['id_nota'] as $id=>$nota) $insert[] ='('. $id .', '. $nota .", '". $intrebarea ."', '" . $_POST['sugestie'][$id] ."')";
- $insert e un array gol in care vor fi adaugate datele care se definesc in codul din foreach().
- foreach() parcurge array-ul $_POST['id_nota'], care e de forma asta:

Cod: Selectaţi tot

$_POST['id_nota'] =['id1'=>'val1', 'id2'=>'val2', 'id3'=>'val3'];
Deci, in codul:

Cod: Selectaţi tot

foreach($_POST['id_nota'] as $id=>$nota) $insert[] ='...'. $_POST['sugestie'][$id] .'...';
- Se parcurge array-ul $_POST['id_nota'], la fiecare element parcurs se preia cheia /indexul lui in $id, si valoarea asociata in $nota.
- In $insert se adauga datele definite cu cele din $id si $nota.
- $_POST['sugestie'][$id] e valoarea care se afla la fiecare cheie cu valoarea $id (obtinuta cu foreach()) din $_POST['sugestie'].

Daca ai nelamuriri despre anumite functii si instructiuni php, poti sa studiezi documentatia de la php.net, sau dai cautare pe net cu acea functie /instructiune.

sterica
am inteles cum stau acum lucrurile, insa mai am o mica nelamurire,

Cod: Selectaţi tot

$insert[] ='('. $id .', '. $nota .", '". $intrebarea ."', '" . $_POST['sugestie'][$id] ."')";
parantezele patrate modifica variabila in array, este acelasi lucru ca si?

Cod: Selectaţi tot

$insert =array ('('. $id .', '. $nota .", '". $intrebarea ."', '" . $_POST['sugestie'][$id] ."')");
Multumesc!

MarPlo
Nu e acelasi lucru.
Parantezele patrate in dupa numele de variabila tip array (inainte de egal) adauga un element nou in acel array, dupa cele deja existente, cu urmatorul index numeric (cheie) crescator (ca AUTO_INCREMENT la tabele sql).
Exemplu:

Cod: Selectaţi tot

$arr =['e1'];
$arr[] ='e2'; //add another element in $arr, with next numeric index
$arr[] ='xyz'; //add another element in $arr

//test
var_export($arr); // array(0=>'e1', 1=>'e2', 2=>'xyz')
Syntaxa array(), sau [...] Dupa egal, creaza un nou array; deci va Rescrie celelalte elemente existente.
Exemplu:

Cod: Selectaţi tot

$arr =['e1'];
$arr[] ='e2'; //add another element in $arr
$arr[] ='xyz'; //add another element in $arr

//rewrite the $arr data
$arr =['kx'=>'abc ..']; //the same with array('abc ..')

//test
var_export($arr); // array('kx'=>'abc ..')
- Documentatia completa, cu exemple si explicatii se gaseste la: PHP Arrays - Manual

sterica
multumesc mult de ajutor, am inteles cum stau lucrurile acum

sterica
Am crezut ca l-am inteles pe deplin insa am ajuns la o alta nelamurire

Cod: Selectaţi tot

$insert_str = null;
$nota_pers = $_POST ['nota_pers'];
$intrebare = $_POST ['intrebare'];
$sugestie = array_filter($_POST ['sugestie']);

foreach ($nota_pers as $key => $value){
}

foreach ($sugestie as $key2 => $value2) {
	$insert_str [] = '(' . $key . ', ' . $value . ', ' . $intrebare . ', ' . $value2 . ')';
}
$insert_str are forma aceasta:

Cod: Selectaţi tot

Array
(
    [0] => (29, 8, 1, 'test')
    [1] => (29, 8, 1, 'te')
)
pe prima linie trebuia sa am [0] => (55,3,1, 'test').
Unde gresesc?
Multumesc!

MarPlo
Variabilele $key si $value pe care le folosesti in al doilea foreach() apartin ultimului element din array-ul parcurs de primul foreach() (unde sunt create si ramase dupa ce s-a parcurs si ultimul element).
Daca cele doua array au aceleasi chei, si difera valorile, poti face asa:

Cod: Selectaţi tot

foreach ($sugestie as $key2 => $value2) {
  $insert_str [] = '(' . $key2 . ', ' . $nota_pers[$key2] . ", '" . $intrebare . "', '" . $value2 ."')";
}

sterica
functioneaza perfect. Multumesc mult!

Subiecte similare