Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> "Rozpakowywanie" array'a w funkcji rekurencyjnej
pawelvod
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 21.09.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
UDAT
post
Post #2





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


array_walk_recursive" title="Zobacz w manualu php" target="_manual
Go to the top of the page
+Quote Post
pawelvod
post
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 21.09.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
jarrod
post
Post #4





Grupa: Zarejestrowani
Postów: 312
Pomógł: 9
Dołączył: 14.10.2006
Skąd: warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
pawelvod
post
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 21.09.2006

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 20:27