Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: FORM tablicowy, zmiana "name" ze string na array
Forum PHP.pl > Forum > PHP
bulimaxiu
Witam.

Mam w FORMie układ tablicowy:
  1. <input name="data[1]" type="text" />
  2. <input name="data[15]" type="text" />
  3. ...

W PHPie wiadomo, odczytam poprzez
  1. $firstname = $_POST['data'][15];
  2. ...
, lub jakoś podobnie, to nie problem.

FORM jest generowany przez PHP, gdzie name jest podawany jako string ("data[15]"); parametr dodatkowy "15" jest zmienny. Potrzebuję jednak w PHP przekazać name ("data[15]") jako string do funkcji PHP i tu rozłożyć to na array, czyli np. $_POST['data'][15]. Wiadomo, gdy zastosuję $_POST[$name], wyjdzie $_POST[data[15]],a potrzeba $_POST['data'][15]. Czy można to rozwiązać jakoś funkcją? Bo nie chcę robić funkcji na analizę znaków w stringu i krok po kroku robić array; chyba że nie da rady inaczej.
mortus
W ogóle nie rozumiem pytania, ale chyba i Ty źle coś rozumiesz. Przetestuj poniższy kod:
  1. <?php
  2. if(isset($_POST['action']) && $_POST['action'] == 'check') {
  3. echo '<pre>';
  4. print_r($_POST);
  5. echo '</pre>';
  6. } else {
  7. echo '<form action="" method="post">';
  8. for ($i = 1; $i <= 5; $i++) {
  9. $name = 'data['.$i.']';
  10. echo '<input type="text" name="'.$name.'" value="'.$i.'" /><br />';
  11. }
  12. echo '<input type="hidden" name="action" value="check" /><br />';
  13. echo '<input type="submit" name="submit" value="Check" />';
  14. echo '</form>';
  15. }
bulimaxiu
Twój kod niestety nie odwzorowuje problemu. Chodzi o to, że $i jest traktowane jako dana z formularza a jednocześnie i cała nazwa musi być przekazana do funkcji jako string, z której trzeba zrobić array, żeby wydobyć $i.
Poniższa funkcja działa perfect gdy name jest jednowymiarowy, ale gdy name ma wiele wymiarów sypie się. Gdy do Generatora dochodzi nazwa pola name (np. "data[1]"), pole wygeneruje się dobrze (z name="data[1]"), ale gdy przychodzi do sprawdzania tabeli POST to sprawdza $_POST['data[1]'] i tu się zacina.

  1. private function GenerateTextField ($strType, $arrFuncArgs) {
  2. $strName = $arrFuncArgs[1];
  3. $strValueFromBase = $arrFuncArgs[2];
  4. $strValueDefault = $arrFuncArgs[3];
  5. $strAddArguments = (isSet($arrFuncArgs[4])) ? $arrFuncArgs[4] : null;
  6.  
  7. if (isSet($_POST[$strName])) {
  8. $strValue = $_POST[$strName];
  9. } else if (!isSet($_POST[$strName]) AND !empty($strValueFromBase)) {
  10. $strValue = $strValueFromBase;
  11. } else if (empty($strValueFromBase)) {
  12. $strValue = $strValueDefault;
  13. }
  14.  
  15. $strReturn = '<input type="' . $strType . '" name="' . $strName . '" value="' . $strValue . '" ' . $strAddArguments . '/>';
  16. return $strReturn;
  17. }
Ideę ewentualnego rozwiązania przedstawiam poniżej, tylko może można to zrobić bardziej profesjonalnie niż takie stringowanie
  1. <?php
  2. $a['cos1']['15'] = "test";
  3. $f = "cos1[15]";
  4.  
  5. $g = explode ("[", $f);
  6. foreach ($g as $key1 => $value1) {
  7. if (substr($value1, -1) == "]") {
  8. $g[$key1] = substr ($value1, 0, strlen($value1)-1);
  9. }
  10. if (empty($value1)) {
  11. unSet ($g[$key1]);
  12. }
  13. }
  14.  
  15. echo '<pre>a ' . print_r($a[$g[0]][$g[1]],1 ) . '</pre>';
  16. ?>
d3ut3r
Nie bardzo rozumiem po co ale myślę że możesz użyć czegoś takiego

  1. $arr=$_POST['data'];
  2. foreach ($arr as $key=>$value){
  3. $str[]="data[".$key."]";
  4. }


i na końcu masz tablicę $str w której masz np: "data[1]" , "data[3]" itd.

ok prawdopodobnie nie o to chodziło smile.gif napisz co chcesz osiągnąć będzie łatwiej.
mortus
Chodzi o to, że chcesz wyodrębnić z łańcucha data[10] dwa klucze (indeksy) dla tablicy $_POST (pierwszy to data, drugi to 10)? Użyj wyrażeń regularnych:
  1. $pattern = '#([A-Za-z][A-Za-z0-9:_.-]+)\[([0-9]+)\]#';
  2. $str = 'data[10]';
  3. preg_match($pattern, $str, $matches);
  4. $firstKey = $matches[1];
  5. $secondKey = $matches[2];
  6. unset($matches);
  7. // odwołanie do $_POST
  8. // $_POST[$firstKey][$secondKey] = $_POST['data'][10];
  9. if(isset($_POST[$firstKey][$secondKey])) {
  10. // właściwy kod
  11. }


EDIT
Pierwszy człon wyrażenia regularnego trzeba jeszcze rozszerzyć o znaki, jakie mogą znajdować się w atrybucie name elementu HTML, ale nie pamiętam jakie to znaki.
Sprawdziłem i już poprawiłem wzorzec.
bulimaxiu
To jest to mortus, dziękuję za pomoc.
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.