Autor Zpráva
ts_istudio
Profil
Mám proměnnou $config, ve které je spousta údajů. Potřeboval bych získat všechny hodnoty pod $config['inc_web_popis']. Níže uvedené php vypíše:
inc_web_popis ** -Array
inc_xxx ** -Array

Já bych ale potřeboval hledat v té poslední úrovni indexů (v příkladu 1-4, 25-27) a když najdu, vrátit odpovídající řetězec "kat" nebo "subkat" a hodnotu ("úvodní strana"). Že je to prasárna, to vím. Je to v projektu, který jsem převzal a není možné to udělat slušně.
To číslo (1-4, 25-27) je v celém $config['inc_web_popis'] unikátní.

$config['inc_web_popis']['kat'][1] = "úvodní strana";
$config['inc_web_popis']['kat'][2] = "služby";
$config['inc_web_popis']['kat'][3] = "kontakt";
$config['inc_web_popis']['kat'][4] = "sortiment";
$config['inc_web_popis']['subkat'][25] = "sortiment";
$config['inc_web_popis']['subkat'][26] = "sortimfdgdfhent";
$config['inc_web_popis']['subkat'][27] = "sdfsdfsortiment";

$config['inc_xxx'][10] = "odkazy";
$config['inc_xxx'][2] = "fgdus";
$config['inc_xxx'][3] = "dkddd";

echo getDruh($config);

function getDruh($input){

  foreach ($input as $key => $value) {
    if ( is_array($cell)) {
      $w .= " *** <br>";
      getDruh($value);
    } else {
      $w .= $key." ** -".$value."<br>";
    }
  }
  return $w;
}
tiso
Profil
Neviem, či som to správne pochopil, myslíš toto:
$w = '';
foreach ($config['inc_web_popis']['kat'] as $value) {
   $w .= "kat ** -$value<br>";
}
foreach ($config['inc_web_popis']['subkat'] as $value) {
   $w .= "subkat ** -$value<br>";
}
ts_istudio
Profil
tiso:
Možná jsem měl napsat, že já ty řetězce "kat" a "subkat" obecně neznám. Takže potřebuju naslepo projít všechno, co je pod $config['inc_web_popis']. Teď uvažuju, jestli to vůbec jde.
peta
Profil
http://www.php.net/manual/en/ref.array.php
http://www.php.net/manual/en/function.array-search.php
http://www.php.net/manual/en/function.in-array.php

foreach se da napsat tez takto (jestli jsi se dival na mozna reseni v manualu...)
foreach ($config as $key=>$value) {
   $w .= "$key => $value<br>";
}
Nebo tez zajimavy muze byt each Example 2
<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>
ts_istudio
Profil
peta:
Tvoje rady jsou tak přínosné, jako obvykle. Ještě jednou si přečti ten můj text a zamysli se, jestlis napsal něco, co nevím.
juriad
Profil
Pokud víš, že ten index bude unikátní, tak by ti mohlo pomoct následující:
function doFlatten($pole, $klice, &$vysledek) {
    foreach ($pole as $klic => $hodnota) {
        $noveKlice = $klice;
        $noveKlice[] = $klic;
        if(is_array($hodnota)) {
            doFlatten($hodnota, $noveKlice, $vysledek);
        } else {
            $vysledek[$klic] = array('hodnota' => $hodnota, 'klice' => $noveKlice);
        }
    }
}

function flatten($pole) {
    $vysledek = array();
    doFlatten($pole, array(), $vysledek);
    return $vysledek;
}

přechroustá pole do podoby:
Array
(
    [1] => Array
        (
            [hodnota] => úvodní strana
            [klice] => Array
                (
                    [0] => inc_web_popis
                    [1] => kat
                    [2] => 1
                )
        )
    [2] => Array
        (
            [hodnota] => fgdus
            [klice] => Array
                (
                    [0] => inc_xxx
                    [1] => 2
                )
        )
    [3] => Array
        (
            [hodnota] => dkddd
            [klice] => Array
                (
                    [0] => inc_xxx
                    [1] => 3
                )
        )
    [4] => Array
        (
            [hodnota] => sortiment
            [klice] => Array
                (
                    [0] => inc_web_popis
                    [1] => kat
                    [2] => 4
                )
        )
    [25] => Array
        (
            [hodnota] => sortiment
            [klice] => Array
                (
                    [0] => inc_web_popis
                    [1] => subkat
                    [2] => 25
                )
        )
    [26] => Array
        (
            [hodnota] => sortimfdgdfhent
            [klice] => Array
                (
                    [0] => inc_web_popis
                    [1] => subkat
                    [2] => 26
                )
        )
    [27] => Array
        (
            [hodnota] => sdfsdfsortiment
            [klice] => Array
                (
                    [0] => inc_web_popis
                    [1] => subkat
                    [2] => 27
                )
        )
    [10] => Array
        (
            [hodnota] => odkazy
            [klice] => Array
                (
                    [0] => inc_xxx
                    [1] => 10
                )
        )
)
Předposlední prvek v poli klíče je vždy klíč rodiče. Šlo by to napsat tak, aby tam byl přímo ten rodič, ale toto univerzálnější.
DarkMeni
Profil
function getDruh($input){
  foreach ($input as $key => $value) {
    if ( is_array($cell)){
      $w .= " *** <br>";
      getDruh($value);
    } else {
      $w .= $key." ** -".$value."<br>";
    }
  }
  return $w;
}
Tohle vypadá že dělá skoro to samí co var_dump() s polem a $cell nemáš definovanej (takže by to mohlo vypisovat varování), neměl být $cell náhodou $value?
A nebo jednodušší verze by byla třeba: var_dump($array);
Jestli v tom chceš vyhledávat nějakej text, tak bys mohl zkusit, jestli by to nešlo udělat třeba takto:
function getDruh($input, $find){
  $w = "";
  $f = array();
  foreach ($input as $key => $value) {
    if (is_array($value)){
      $w .= " *** <br>";
      getDruh($value); // Tohle je špatně, chtělo by to tu nějak pořešit tu rekurzi
    } else {
      if($find == $value){
        $f[] = $key;
      }
      $w .= $key." ** -".$value."<br>";
    }
  }
  return array($w, $f);
}
Nebo když víš že je to pole tříúrovňový, tak by to šlo udělat i jinak (jednodušeji), místo rekruzivního volání funkce vložit 2x forach do sebe
mylan
Profil
Použiť funkciu na rekurzívne hľadanie vo viacrozmernom poli, napríklad odtiaľto a upraviť si ju.
tiso
Profil
ts_istudio: aha, tak si to uprav takto:
getDruh($config['inc_web_popis']);

function getDruh($input){
  $w = '';
  foreach ($input as $key => $value) {
    foreach ($value as $value2) {
      $w .= $key." ** -".$value2."<br>";
    }
  }
  return $w;
}
peta
Profil
ts_istudio: Ok. Polopate. Pomoci array_keys ziskas seznam klicu v nejblizsi vetvi. Pomoci in_array mezi nimi vyhledas ten, ktery te zajima. Pokud tam neni, tak pomoci foreach, kteremu predas seznam klicu a objekt, projdes opet vsechny klice a provedes celou funkci s hledanim klice znovu. A tak dal pro vsechny klice.
A jestli se chces nad nekoho povysovat, mohl by sis uvedomit, ze ja tu rekurzivni funkci napsat umim a ty ne.
ts_istudio
Profil
Tak nakonec to bylo jednodušší, než jsem myslel. Použil jsem postup od tiso, díky moc, i ostatním, kteří se nad tím zamysleli.

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