Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] przekształcenie tablicy (spłaszczenie?)
Forum PHP.pl > Forum > Przedszkole
mlawnik
Witam,

Czy ktoś mógłby mnie nakierować w jaki sposób tablicę pobraną przez PDO::FETCH_ASSOC:

array
0 =>
array
'subjectId' => string '1' (length=1)
'subjectName' => string 'biologia' (length=8)
1 =>
array
'subjectId' => string '2' (length=1)
'subjectName' => string 'chemia' (length=6)
2 =>
array
'subjectId' => string '3' (length=1)
'subjectName' => string 'fizyka' (length=6)
3 =>
array
'subjectId' => string '4' (length=1)
'subjectName' => string 'geografia' (length=9)
4 =>
array
'subjectId' => string '5' (length=1)
'subjectName' => string 'historia' (length=8)
5 =>
array
'subjectId' => string '6' (length=1)
'subjectName' => string 'j. niemiecki' (length=12)
6 =>
array
'subjectId' => string '7' (length=1)
'subjectName' => string 'j. polski' (length=9)
7 =>
array
'subjectId' => string '8' (length=1)
'subjectName' => string 'matematyka' (length=10)
8 =>
array
'subjectId' => string '9' (length=1)
'subjectName' => string 'muzyka' (length=6)
9 =>
array
'subjectId' => string '10' (length=2)
'subjectName' => string 'plastyka' (length=8)
10 =>
array
'subjectId' => string '11' (length=2)
'subjectName' => string 'wi' (length=2)

Przekształcić do takiej postaci:

array
1 => string 'biologia' (length=8)
2 => string 'chemia' (length=6)
3 => string 'fizyka' (length=6)
4 => string 'geografia' (length=9)
5 => string 'historia' (length=8)
6 => string 'j. niemiecki' (length=12)
7 => string 'j. polski' (length=9)
8 => string 'matematyka' (length=10)
9 => string 'muzyka' (length=6)
10 => string 'plastyka' (length=8)


Pozdrawiam,
mlawnik
nospor
Przelatujesz po tej tablicy przy pomocy FORECH i w kazdym obrocie FOREACH tworzysz swoja wlasna plaską tablice.
skowron-line
Chyba że masz już php 5.5 wtedy wystarczy Ci
http://www.php.net/manual/en/function.array-column.php
a jak nie to patrz w komentarze
mlawnik
php 5.5 będę sobie musiał skompilować tongue.gif

Dobra, rozwiązałem.

Dla potomnych:

  1. <?php
  2. //convert array
  3. $subjectIdsNew = array();
  4. foreach($subjectIds as $key=>$val)
  5. {
  6. foreach ($val as $value) {
  7. $subjectIdsNew[$key+1] = $value;
  8. }
  9. }
  10. ?>


PS o, fajne to array_column, zapamiętam sobie.

EDIT Jeszcze dla potomnych bez php >= 5.5

implementacja array_column w plain php
https://github.com/ramsey/array_column
nospor
facepalmxd.gif

  1. $subjectIdsNew = array();
  2. foreach($subjectIds as $key=>$val)
  3. {
  4. $subjectIdsNew[$val['subjectId']] = $val['subjectName'];
  5. }
mlawnik
Powinno być +1 przy key.

@nospor, dziękuję za gotowca, wykorzystam go.

Mógłbyś mi jednak wytłumaczyć co zrobiłem źle? tzn. Działa, ale skoro w twoim poście wystąpił facepalm, to coś jest nie tak.
nospor
Nie, twoj kod nie dziala poprawnie. CHciales jako klucz przeciez miec wartosc pola subjectId a nie wartosc klucza tablicy zwroconej przez PDO.... to chyba zasadnicza roznica, nie sadzisz? I nie, zadne +1 tutaj nie pomoze, bo gdy twoje wartosci z pola subjectId beda zupelnie rozne lub z dziurami to twoj algorytm szlag trafia.

Poza tym robisz dwukrony foreach, przez co twoj skrypt wykonuje 2 x wiecej operacji. Jakby pol bylo np.4 to by robil 4x wiecej operacji. I tez przypisuje ci cudem wartosc z pola subjectName tylko dlatego ze to pole jest ostatnie. Jakby nie bylo ostatnie to bys tej wartosci w wynikowej tablicy nie mial.

A teraz jeszcze raz przyjrzyj sie mojemu kodowi po przeczytaniu tych uwag.
mlawnik
  1. $subjectIdsNew = array();
  2. foreach($subjectIds as $key=>$val)//Czy to key jest tutaj potrzebne?
  3. {
  4. $subjectIdsNew[$val['subjectId']] = $val['subjectName'];
  5. }


Poniższe działa dobrze:
  1. $subjectIdsNew = array();
  2. foreach($subjectIds as $val)
  3. {
  4. $subjectIdsNew[$val['subjectId']] = $val['subjectName'];
  5. }
nospor
Nie, w tym wypadku $key nie jest potrzebne
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.