Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zmiany zagnieżdzonej tablicy - rekursywna
Forum PHP.pl > Forum > Przedszkole
haryb
Mam z pozoru proste zadanie do zrobienia ale po kilku podejściach w różny sposób za kazdym razem dochodze do momentu że coś nie gra. Dlatego zdecydowałem się że tutaj przedstawie swój problem i może na forum znajdzie się sposób którego nie widze. Kombinowałem z recurencją, z iteratorami ale nie mogę tego osiągnąć co potrzebuje.

Zadanie polega na zbudowaniu nowej tablicy (lub modyfikacji wzorcowej) na podstawie wzorcowej plus dodając pewne nowe elementy.
Tablica wejściowa może mieć dużo więcej zagniezdzeń oraz większą ilość elementów.

Tablica wejściowa:
  1. public $tmp_tab = [
  2. 100001 => [
  3. 104089 => [
  4. 101963 => [
  5. 111119,
  6. 101816,
  7. ],
  8. ],
  9. ],
  10. ];


A wyjściowo powinna tak wyglądać:
  1. public $tmp_tab2 = [
  2. 100001 => [
  3. 'id' => 100001,
  4. 'children' => [
  5. 104089 => [
  6. 'id' => 104089,
  7. 'children' => [
  8. 101963 => [
  9. 'id' => 101963,
  10. 'children' => [
  11. 111119 => [
  12. 'id' => 111119
  13. ],
  14. 101816 => [
  15. 'id' => 101816,
  16. ],
  17. ],
  18. ],
  19. ],
  20. ],
  21. ],
  22. ],
  23. ];

kayman
aż ciekaw jestem w czym problem

imo całość obskoczy 1 funkcja
kapslokk
Robisz funkcję rekurencyjną która:

Jesli parametr jest tablicą to przelatuje przez wszystkie jej elementy i tworzy tablicę, której wartości będą w formie:

  1. [
  2. 'id' => $id,
  3. 'children' => wynik_tej_funkcji_dla_wartosci_aktualnego_elementu
  4. ]

a jeśli nie to po prostu zwróci [ 'id' => $parametr ]

i tyle smile.gif
haryb
Kombinuje cos takiego.

Zrobiłem metode pomocniczą wyciągająca bezpośrednie dzieci:
  1. function pobierz_bezposrednie_podkategorie($array, $keySearch)
  2. {
  3. if (isset($array[$keySearch])) {
  4. $childrenKeys = [];
  5. foreach ($array[$keySearch] as $idCategory => $child) {
  6. $childrenKeys[] = is_array($child) ? $idCategory : $child;
  7. }
  8. return $childrenKeys;
  9. }
  10. foreach ($array as $key => $item) {
  11. if ($key == $keySearch) {
  12. return array_keys($item);
  13. } else {
  14. if (is_array($item)) {
  15. return $this->pobierz_bezposrednie_podkategorie($item, $keySearch);
  16. }
  17. return [];
  18. }
  19. }
  20. }


I metodę która rekurencyjnie przelatuje po wejściowej tabeli i na podstawie jej tworzy nową.
  1. private function getCategory2($id_kategoria)
  2. {
  3. $this->tab_result_ver2[$id_kategoria]["id"] = $id_kategoria;
  4. foreach ($this->pobierz_bezposrednie_podkategorie($this->tmp_tab, $id_kategoria) as $id_kategoria_dziecka) {
  5. $this->tab_result_ver2[$id_kategoria]["children"][$id_kategoria_dziecka]["id"] = $id_kategoria_dziecka;
  6. $this->getCategory2($id_kategoria_dziecka);
  7. }
  8. }
  9.  
  10. $this->getCategory2(100001);
  11. debug($this->tab_result_ver2);
  12.  


Niestety tutaj mam problem z poprawnym przypisaniem podtablic do odpowiednich kluczy.
Ponieważ w kazdej iteracji mam info jakie powinno byc teraz id plus id rodzica, ale jak jest wiele zadniezdzeń to potrzeba informacji o całej ścieżce kluczy pod jakimi trzeba zapisać nową tablice.
Czy przekombinowuje ?
kayman
ja myślę tak

jak szukam jakiegoś klucza w tablicy to po znalezieniu go dopiero obrabiam dalej w zależności od wyniku/zawartości

więc

metoda szukająca(ew zapisująca zagnieżdżania ja sa ku czemu potrzebne) -> metoda obrabiająca wynik

nie wiesz czy na dane id trafisz w pierwszym czy w n zagdzieżdzeniu
kapslokk
  1.  
  2. $tab = [
  3. 100001 => [
  4. 104089 => [
  5. 101963 => [
  6. 111119,
  7. 101816,
  8. ],
  9. ],
  10. ],
  11. ];
  12.  
  13. function convertArray($input){
  14. if(!is_array($input)){
  15. return ['id'=>$input];
  16. }else{
  17. $return = [];
  18. foreach($input as $key=>$value){
  19. $return[$key] = ['id'=>$key, 'children'=>convertArray($value)];
  20. }
  21. return $return;
  22. }
  23. }
  24.  
  25. var_dump(convertArray($tab));
  26.  
  27.  
haryb
  1. public function convertArray($input){
  2. if (!is_array($input)){
  3. return ['id'=>$input];
  4. } else {
  5. $return = [];
  6. foreach($input as $key => $value){
  7. if (!is_array($value)) {
  8. $return[$value] = ['id' => $value];
  9. } else {
  10. $return[$key] = ['id' => $key, 'children' => $this->convertArray($value)];
  11. }
  12. }
  13. return $return;
  14. }
  15. }


Wprowadziłem drobną modyfikację tak by w sytuacji jak ostatnim liściem jest element nietablicowy stworzył tablice z kluczem id ale bez dzieci.
Ale faktycznie o to chodziło. Dzięki kapslokk faktycznei cały czas krążyłem w różnych moich rozwiązaniach wokół takiej metody ale Ty faktycznie to pokazałeś prościej i mniej skomplikowanie niż jak kombinowałem. A efekt zamierzony
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.