Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: "Rozpakowywanie" array'a w funkcji rekurencyjnej
Forum PHP.pl > Forum > PHP
pawelvod
Mam tablicę wielokrotnie zagnieżdzoną. Jak zbudować funkcję (pewnie rekurencyjną), która wejdzie w każde miejsce tablicy i sprawdzi jakąś zależność. Dana zależność ma być szukana na wszystkich piętrach i we wszystkich elementach tablicy. Konkretnie chodzi o podmianę nazwy "założyciela rekordu" w zależności od tego czy był to gość (wtedy nazwę pozstawia niezmienioną), czy był to zalogowany użytkownik (wtedy kopiuje aktualną nazwę z profilu użytkownika). Rekordy trzymam w tablicy króra ma podrekordy, te mają podrekordy itd... Na razie napisałem funkcję która robi to trzy piętra w głąb i działa na zasadzie trzech zagnieżdzonych FOREACH, ale chciałbym napisać taką działającą na nieskończenie zagnieżdzonej tablicy i nie mogę sobie poradzic z przekazaniem miejsca na którym w danym momencie ma sie odbywać przekształcenie w tablicy.
pawelvod
Ta funkcja przechodzi przez każdy element tablicy zagnieżdzonej, ale nie pozwala na odwoływanie się do innych elementów tej tablicy. Moja tablica jest zorganizowana w sposób:

array(
0=> array(
nazwa_uzytkownika => janek
dane uzytkownika => array(
funkcja => admin
nazwa => w miedzyczasie zmieniona na jasiek
),
),
1=>array(
nazwa_uzytkownika => juzek
dane uzytkownika => array(
funkcja => gosc
nazwa => gosc
),
),
);
funkcja musi sprawdzać czy istnieje pole dane użytkownika (zawierające array) i w zależności od tego pzrepisywać nazwę użytkownika lub nie.
Tak jak pisałem dane te mogą się trafić na różnych piętrach tablicy.
jarrod
nie wiem czy dobrze zrozumiałem ale chyba szukasz czegoś takiego:
  1. <?php
  2. $t = array(
  3. 'nazwa_uzytkownika'  => 'janek',
  4. 'dane uzytkownika'  => array(
  5. 'funkcja' => 'admin',
  6. 'nazwa' => 'w miedzyczasie zmieniona na jasiek'
  7. )
  8. ),
  9. 'nazwa_uzytkownika' => 'juzek',
  10. 'dane uzytkownika' => array(
  11. 'funkcja'  => 'gosc',
  12. 'nazwa'  => 'gosc'
  13. )
  14. ),
  15. 'nazwa_uzytkownika' => 'xxxx',
  16. 'dane uzytkownika' => array(
  17. 'funkcja'  => 'gosc',
  18. 'nazwa'  => 'gosc'
  19. )
  20. )
  21. );
  22.  
  23.  
  24. function chkTbl( $aInp , $sLookFor , $sRepl )
  25. {
  26. if( is_array( $aInp ) )
  27. {
  28. foreach( $aInp as $key => $val )
  29. {
  30.  
  31. if( is_array( $val ) )
  32. {
  33. //
  34. // tutaj następuje rekurencja
  35. //
  36. $aInp[$key] = chkTbl( $aInp[$key] , $sLookFor , $sRepl );
  37. }
  38. else
  39. {
  40. //
  41. // Ja tutaj szukam po kluczu. Ale jeśli zmienisz na $val 
  42. // to funkcja będzie szukała po wartości
  43. //
  44. if( $key == $sLookFor )
  45. {
  46. //
  47. // tutaj sprawdzasz czy jest to użytkownik
  48. // i zamieniasz na podany parametr (czy co chcesz innego)
  49. //
  50. if( true )
  51. {
  52. $aInp[$key] = $sRepl;
  53. }
  54. }
  55. }
  56. }
  57. }
  58. return $aInp;
  59. }
  60.  
  61.  
  62.  
  63. $w = chkTbl( $t , 'nazwa' , 'zamiennik' );
  64.  
  65. echo '<pre>';
  66. var_dump( $w );
  67. echo '</pre>';
  68. ?>


wystarczy tą funkcję lekko zmodyfikować aby zupełnie inaczej działała.
pawelvod
Zrobiłem przez foreach i referencje:
  1. <?php
  2. function renameUsername(&$table)
  3. {
  4. //zamnienia nazwy creator name i editor name w zależności od tego kto stworzył
  5. if (!isset($table)) return;
  6. if (!is_array($table)) return;
  7. foreach ($table as $keyRecord=>&$record)
  8. {
  9. if (isset($record['created_by'])&&isset($record['created_by']['username']))
  10. {
  11. if ($record['created_by']['id']<>1) @$record['creator_name'] = $record['created_by']['username'];//$result[$key][$recordKey]['creator_name'] = $this->find
  12. }
  13. if (isset($record['edited_by'])&&isset($record['edited_by']['username']))
  14. {
  15. if ($record['edited_by']['id']<>1) @$record['editor_name'] = $record['edited_by']['username'];//$result[$key][$recordKey]['creator_name'] = $this->find
  16. }
  17. $this->renameUsername($record);
  18. }
  19. }
  20. ?>
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.