Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: reduktor tablicy
Forum PHP.pl > Inne > Oceny
tvister
Prezentuje metode do oceny. Przydatna przy walidacji przekazywanych zmiennych z formularza. Prosze o uwagi.

  1. /**
  2.   * reduktor tablic do ustalonego wymiaru
  3.   * @param array &$tabl
  4.   * @param string $wym
  5.   * @return void
  6.   *
  7.   */
  8. static function red_tabl(&$tabl, $wym = 1) {
  9. if (is_array($tabl)) {
  10. switch(intval($wym)){
  11. case 1 :
  12. $tabl_tmp = $tabl;
  13. for($i = 0; $i < count($tabl_tmp); $i++) {
  14. if (is_array($tabl_tmp[$i])) unset($tabl_tmp[$i]);
  15. }
  16. $tabl = $tabl_tmp;
  17. break;
  18. case 2 :
  19. for($i = 0; $i < count($tabl); $i++) {
  20. self::red_tabl($tabl[$i], $wym - 1);
  21. }
  22. break;
  23.  
  24. default:
  25. $tabl = reset($tabl);
  26. self::red_tabl($tabl,0);
  27.  
  28. }
  29. }
  30. }
wookieb

  1. $tab = array('test','heheh', 'zonk'=>array(), 'lol', array());
  2. print_r($tab);
  3. $tab2 = $tab;
  4.  
  5. //
  6. red_tabl($tab);
  7. print_r($tab);
  8. $tab = $tab2;
  9.  
  10. // lepsze "identyczne" działanie
  11. $newTab= array_filter( $tab, 'is_scalar');
  12. print_r($newTab);


Metoda 2 i default powoduje zawieszenie skryptu. Dlaczego? Nigdy nie kończysz wywoływania pętli. Więc czemu ta funkcja ma służyć to nie wiem.
tvister
Dzieki za cenne rady. Wprowadziłem małe poprawki.
Zadaniem met jest zredukowanie tablicy przekazanej z formularza do z góry założonego wymiaru(1,2).
Takie zabezpieczenie od np: tabl[][][][]...

  1. /**
  2.   * reduktor tablic do ustalonego wymiaru
  3.   * @param array &$tabl
  4.   * @param string $wym
  5.   * @return void
  6.   *
  7.   */
  8. static function red_tabl(&$tabl, $wym = 1) {
  9. if (is_array($tabl)) {
  10. switch(intval($wym)) {
  11. case 1 :
  12. $tabl_tmp = $tabl;
  13. foreach($tabl_tmp as $k => $w) {
  14. if (is_array($tabl_tmp[$k])) unset($tabl_tmp[$k]);
  15. }
  16. $tabl = $tabl_tmp;
  17. break;
  18. case 2 :
  19. foreach($tabl as $k => $w) {
  20. self::red_tabl($tabl[$k], $wym - 1);
  21. }
  22. break;
  23. default:
  24. $tabl = reset($tabl);
  25. self::red_tabl($tabl,0);
  26. }
  27. }
  28. return;
  29. }
wookieb
Nadal były błędy z 0...
  1. function red_tabl(&$tabl, $wym = 1) {
  2. if(!is_array($tabl)) return;
  3.  
  4. $wym = intval($wym);
  5.  
  6. if($wym>1)
  7. {
  8. foreach($tabl as &$w) {
  9. red_tabl($w, $wym - 1);
  10. }
  11. }
  12. elseif($wym>0)
  13. {
  14. foreach($tabl as $k => $w) {
  15. if (is_array($w)) unset($tabl[$k]);
  16. }
  17. }
  18. }


Zanika sens wymiarowości 0. Dlaczego? Spójrz na przykład
  1. $tab = array(
  2. array('tt',
  3. array('tt',
  4. array('tt')
  5. )
  6. ),
  7. 'tt','ll',
  8. array('tt'),
  9. array('tt', array('tt'))
  10. );
  11. print_r($tab);
  12.  
  13. red_tabl($tab, 0);
  14. print_r($tab);
  15.  
tvister
Rzeczywiście masz racje.
Parametr zero jest nie logiczny tak samo jak parametry ujemne dla tej metody.
Po raz kolejny dzięki.
Cysiaczek
Przenoszę na Oceny
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.