Comparare array asociativ cu campuri din baza de date

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

Comparare array asociativ cu campuri din baza de date

Salut,
Am un array ascociativ ($key=>$value, in care $key este denumirea conventionala a cimpului (pentru cap de tabel html) iar $value este efectiv numele cimpurilor din tabela).
Vreau ca dintr-un

Cod: Selectaţi tot

SELECT * FRM tabela
(conexiune PDO) clasa class.pdo_mysqli.php sa-mi intoarca alt array ascociativ de tipul ($key=>$value) in care $key este numele cimpului iar $value este valoarea cimpului.
In al doilea array sint mai multe cimpuri (toate), ma intereseaza cimpurile din primul array (cele care apar in tabelul html).
Cum compar cele 2 array-uri dupa criteriul: primul array $value = al doilea array $key (adica numele cimpurilor din cele 2) si sa fac al treilea array ascociativ cu numele cimpurilor din primul array si valoarea corespunzatoare a cimpurilor din al doilea array?
Multumesc.

MarPlo
Salut
Apropo de clasa pdo_mysqli, ieri am remediat o mica problema care putea sa apara la ea.
Nu permitea returnarea datelor din Select cand aceasta instructiune incepea cu altceva decat "SELECT", de exemplu cu o paranteza:

Cod: Selectaţi tot

( SELECT * FROM table ORDER BY id DESC LIMIT 12) ORDER BY id
Acum functioneaza corect, si e bine sa o preiei de pe site.

- Si acum la chestiunea din acest topic.
Fiecare colana /camp din baza de date are mai multe valori, cate una pt. fiecare rand; deci, ca sa ai $camp=>$valoare ar trebui sa selectezi un singur rand in care va fi acea $valoare, altfel $valoare e de fapt un alt array cu datele din randuri.
Ca sa compari doua array-uri asociative, in general se folosesc doua foreach() imbricate.
Din ce am intele ca vrei, pot sa dau acest exemplu:

Cod: Selectaţi tot

$ar1 =['k1'=>'c1', 'k2'=>'c2', 'k3'=>'c3'];
$ar2 =[  //returnat de pdo_mysqli
  0=> ['c0'=>'v0', 'c1'=>'v1', 'c2'=>'v2', 'c3'=>'v3', 'c4'=>'v4'],
  1=> ['c0'=>'x0', 'c1'=>'x1', 'c2'=>'x2', 'c3'=>'x3', 'c4'=>'x4']
];
$ar3 =[];
foreach($ar1 as $k=>$c){
  foreach($ar2 as $row){
    //if column $c in $row, add it in $ar3 with key $k
    if(isset($row[$c])){
      if(!isset($ar3[$k])) $ar3[$k] =[];
      $ar3[$k][] = $row[$c];
    }
  }
}

var_export($ar3); // [k1'=>['v1', 'x1'], 'k2'=>['v2', 'x2'], 'k3'=>['v3', 'x3'] ] 
Daca vrei altfel, mai bine sa dai un exemplu cum e primul array, cum e al doilea array (sau in baza de date) si cum vrei sa rezulte al treilea array.

andras
Primul array arata asa:

Cod: Selectaţi tot

array ( 'Nume' => 'nume', 'Prenume' => 'prenume', 'Virsta' => 'virsta', )
iar al doilea array dupa instructiunile:

Cod: Selectaţi tot

$rows = $conn->sqlExec($re);
var_export($rows); 
arata asa :

Cod: Selectaţi tot

array ( 0 => array ( 'pers_id' => 103, 0 => 103, 'nume' => 'ion', 1 => 'ion', 'prenume' => 'vasile', 2 => 'vasile', 'virsta' => 11, 3 => 11, 'userid' => 0, 4 => 0, 'datamod' => '2016-02-08 10:53:08', 5 => '2016-02-08 10:53:08', ), )
Intr-adevar, in al doilea array extrag o singura inregistrare, imi trebuie sa scriu valorile in formularul pentru Modify (Update).
Al treilea array vreau sa arate cam asa (pseudocod) :

Cod: Selectaţi tot

array ( 'nume' => 'ion', 'prenume' => 'vasile', 'virsta' =>11, )
Cu acest array voi atribui valori elemntelor input din formularul Modify. Voi studia codul, multumesc.

MarPlo
Vezi daca iti e de folos acest cod:

Cod: Selectaţi tot

$ar1 =['Nume'=>'nume', 'Prenume'=>'prenume', 'Virsta'=>'virsta'];
$rows =[  //returnat de pdo_mysqli
  0=> ['pers_id'=>103, 0=>103, 'nume'=>'ion', 'prenume'=>'vasile', 2=>'vasile', 'virsta'=>11, 3=>11, 'userid'=>0, 4=>0, 'datamod'=>'2016-02-08 10:53:08', 5=>'2016-02-08 10:53:08']
];
$ar3 =[];
foreach($ar1 as $k=>$c){
  //if column $c in $rows, add it in $ar3 with key $k
  if(isset($rows[0][$c])) $ar3[$c] = $rows[0][$c];
}

var_export($ar3); // ['nume'=>'ion', 'prenume'=>'vasile', 'virsta'=>11 ]  
- Sau poti face direct un Select asa, si rezulta din el $ar3 fara sa mai fie nevoie de parcurgere cu foreach():

Cod: Selectaţi tot

$ar1 =['Nume'=>'nume', 'Prenume'=>'prenume', 'Virsta'=>'virsta'];
$sql = "SELECT ". implode(',', $ar1) ." FROM table_name LIMIT 1";  //Select with columns from $ar1
$conn->fetch ='assoc';  //to return results with columns name only (without index number)
$rows = $conn->sqlExec($sql);
$ar3 = ($conn->num_rows >0) ? $rows[0] :[];
var_export($ar3);  
- Daca nu ai nevoie de indexii numerici ai coloanelor in rezultatele Select (0, 1, 2..), ci doar de numele lor, e bine sa setezi valoarea "assoc" la proprietatea $fetch din clasa pdo_mysqli, o face mai rapida (se injumatateste numarul de date returnate; nu le mai repeta si ca indexi numerici). Poti sa setezi direct in codul clasei valoarea acelei proprietati ( public $fetch ='assoc'; ).

andras
Am facut cum ai spus si functioneaza impecabil! Pune valorile in formular. La Update n-am nevoie de indicii numerici, dar in alta parte am nevoie pentru ca la popularea tabelului html folosesc clauza while{}. Partea de INSERT a fost mult mai usor de rezolvat decit partea de UPDATE dar acum sint rezolvate amindoua. Multumesc!

Subiecte similare