Autor Zpráva
Obr_na
Profil *
Nějak nemůžu přijit na kloub, jak bych mohl vypsat stejné položky a udělat z toho select - option.

V mySQL mám v tabulce atributy ... id, typ, nazev

TYP:            NAZEV:
Délka kabelu    5 metrů
Délka kabelu    10 metrů
Délka kabelu    2 metry
Délka kabelu    1 metr
Napájecí zdroj  bez napájecího adaptéru
Napájecí zdroj  adaptér 230V-50Hz/12Vdc
Napájecí zdroj  bez napájecího adaptéru
Napájecí zdroj  adaptér 230V-50Hz/12Vdc

Jde mně o to, udělat z toho:

<p>Délka kabelu: <select name="nazev[]"><option value="">5 metrů</option><option value="">10 metrů</option><option value="">2 metry</option><option value="">1 metr</option></select></p>

<p>Napájecí zdroj: <select name="nazev[]"><option value="">bez napájecího adaptéru</option><option value="">adaptér 230V-50Hz/12Vdc</option><option value="">bez napájecího adaptéru</option><option value="">adaptér 230V-50Hz/12Vdc</option></select></p>

Moc díky za pomoc.
juriad
Profil
Viz Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze
Obr_na
Profil *
juriad díky moc. Maximálně přišlo vhod a pomohlo. Ještě malý detail ..., když script bude na konci stejného výpisu, jak tam vůbec vložím ukončení "</select></p>"? Napadlo mně vložit počítání, ale nevím kolik stejných tam je. Pak mně napadlo vložit to hned na začátek, kdy dám </select></p> a hned <select> .... první bude špatně ... druhý, třetí OK, ale u posledního by to taky chybělo.

Ještě jednou díkec za radu.
Keeehi
Profil
<p><select> před cyklus
</select></p><p><select> do ifu
</select></p> za cyklus
Obr_na
Profil *
Keeehi: před cyklus to dát nemohu <p><select>, protože tam potřebuji vložit už název, který se nachází v IFu :(
Taps
Profil
Obr_na:
určitě to nějak půjde:-) Tak select musí být mimo cyklus
Alphard_
Profil *
U složitějších konstrukcí může být přímé použití uvedeného algoritmu zbytečně nepřehledné.

Zmíněný postup lze použít pro předpřipravení asociativního pole (nebo i složitější objektové struktury) a teprve to pak vypisovat. Tím se dá vyhnout strukturám jako [#4], přepíší se na vnořené cykly
foreach ($groups as $group) {
  echo '<p>'. $group->name;

  echo '<select>';
  foreach ($group->options as $option) {
    echo '<option />';
  }
  echo '</select>';
  echo '</p>';
}
Nevýhodou je vyšší režie na zpracování. Je tam průchod cyklem navíc a budování prakticky duplicitní datové struktury. V běžných podmínkách v tom ale nevidím problém.
Keeehi
Profil
$pamet = null;
while ($line = …) {
    if ($line['typ'] !== $pamet) {
        if($pamet !== null) {
            echo "</select></p>";
        }
        $pamet = $line['typ'];
        echo "<p>$line[typ]: <select name=\"nazev[]\">";
    }
  
    echo "<option value=\"\">$line[nazev]</option>";
}
echo "</select></p>";
Alphard
Profil
[#8] tohle je určitě možné, ale je to přesně ta nepřehledná kontrukce, kterou jsem měl na mysli. Editor v tom nezobrazí párové tagy, nezkontroluje syntaxi, kdyby to bylo v šabloně, nefungují tam pokročilejší prvky vyžadující přehledný DOM.

Kdysi jsem např. do šablon přepsal generování menu v tomto stylu. Dnes už bych, pokud by nebyl dobrý důvod dělat to jinak, v šablonách použil rekurzivně volané makro
{% macro menu_level(levelItem) %}
  <li>  
  <a href=""><span>{{levelItem.name|e}}</span></a>
  {% if levelItem.hasSubitems %}
    <ul>
    {% for item in ... %}
      {{menu_level(item)}}
    {% endfor %}
    </ul>
  {% endif %}
  </li>
{% endmacro %}
Stojí to víc výkonu, ale je to přehlednější a lépe upravitelné.

Zde řešený problém by šel snad obejít nějak takto, aby se šetřil procesor, paměť a finální výpis zůstal přehledný.

$input = [
  ['key' => 'Arabske', 'val' => '1'],
  ['key' => 'Arabske', 'val' => '2'],
  ['key' => 'Arabske', 'val' => '3'],
  ['key' => 'Arabske', 'val' => '4'],
  ['key' => 'Rimske', 'val' => 'I'],
  ['key' => 'Rimske', 'val' => 'II'],
  ['key' => 'Abeceda', 'val' => 'a'],
  ['key' => 'Abeceda', 'val' => 'b'],
  ['key' => 'Abeceda', 'val' => 'c'],
];


function iterateGroup($iter) {
  $line = each($iter);
  while ($line) {
    $val = $line[1];
    yield $val['key'] => function() use ($val, &$iter, &$line) {
      yield $val['val'];
      while (($line = each($iter)) && ($line[1]['key'] === $val['key'])) {
        yield $line[1]['val'];
      }
    };
  }
}

foreach (iterateGroup($input) as $name => $group) {
  echo $name, ':', PHP_EOL;
  foreach ($group() as $item) {
    echo '- ', $item, PHP_EOL;
  }
  echo PHP_EOL;
}

Finální výpis
Arabske:
- 1
- 2
- 3
- 4

Rimske:
- I
- II

Abeceda:
- a
- b
- c

Záměrně jsem při procházení pole všude používal výhradně while a each, aby to bylo nahraditelné za databázove fetch().

Teď jsem si všiml, že když se nezavolá iterace zanořené skupiny, tak se to zacyklí. To není ideální :-), psal jsem to v rychlosti jen jako demonstraci. Jestli to někdo chcete použít, tak to upravte.
Keeehi
Profil
Ano není to hezké. S šablonami bych to napsal asi nějak takto:
{var $it = new ArrayIterator($options);}

<p n:while="$it->valid()">
    {var $pamet = $it->current()['typ']}
    {$pamet}
    <select name="nazev[]" n:inner-while="$it->valid() && $it->current()['typ'] === $pamet">
        <option value="">{$it->current()['nazev']}</option>
        {? $it->next();}
    </select>
</p>

Ale já bych se k takovému problému nedostal. Neboť data bych v databázi měl ve dvou tabulkách a ptal bych se zvlášť na kategorie a zvlášť na produkty.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0