Jak pracovat s array? – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak pracovat s array? – PHP – Fórum – Programujte.comJak pracovat s array? – PHP – Fórum – Programujte.com

 

fix0
Stálý člen
15. 7. 2021   #1
-
0
-

Prosím si o radu, jak pracovat se složitějším polem.

Mám pole, o struktuře začínající na:

Array
(
    [status] => ok
    [data] => Array
        (
            [fishes] => Array
                (
                    [0] => Array
                        (
                            [name] => carp
                            [id] => 1
                            [weight] => 35
                        )

                    [1] => Array
                        (
                            [name] => silur
                            [id] => 2
                            [weight] => 98
                        )

No a já potřebuji zadat "carp" a vrátit jeho ID. Jak by se to prosím dalo zařídit?

Umím to udělat jen v případě jednoduchého pole, ale takhle jsem naprosto bezradný.

Díky moc všem.

Nahlásit jako SPAM
IP: 31.30.163.–
peter
~ Anonymní uživatel
3981 příspěvků
15. 7. 2021   #2
-
0
-

V sql by sis udelal indexy nad databazi.
Tak si udelej indexy pro to pole, ne?

Nedavno jsem psal jednomu cloveku to same. https://www.itnetwork.cz/…0e5fcdb97a96

<?php
$list = array(
array(
    'Id' => 64899,
    'IdP' => 37671,
    'Name' => "Auto-moto"
),
array
(
    'Id' => 64868,
    'IdP' => 64899,
    'Name' => "Autochladničky"
),
array
(
    'Id' => 64876,
    'IdP' => 64868,
    'Name' => "Kompresorové autochladničky"
)
);

$out = array();
$pom = array();

echo '<pre>';

foreach($list as $row)
{
//var_dump($row);
list( $id, $idP, $name ) = array($row['Id'], $row['IdP'], $row['Name']);//zde
//var_dump( $id, $idP );
if (isset($pom[ $idP ]))
        {
        $pom[ $idP ][ $id ] = array( 'IdP'=>$idP, 'Name'=>$name );//zde
        $pom[ $id ] = &$pom[ $idP ][ $id ];
        }
else    {
        $out[ $id ] = array( 'IdP'=>$idP, 'Name'=>$name );//zde
        $pom[ $id ] = &$out[ $id ];
        }
}

var_dump($out);
// $pom[ $idP ][ $id ] = array($idP, $name); slo by pouzit jen toto, ale nevim, zda 0 a 1 nemas jako kategorii
// $pom[ $idP ][ $id ] = $row; // nebo dat tam primo cely row
// $pom[ $idP ][ $id ] = &$row; // nebo dat tam primo cely row jako pointer
// totez u else

foreach($list as $row)
{
$path = array();
$id = $row['Id'];
for (;isset($pom[$id]);)
        {
        $path[] = $pom[$id]['Name'];
        $id = $pom[$id]['IdP'];
        }
echo implode(" > ", array_reverse($path))."\n";
}
?>


C:\xampp\htdocs\www\parse-category\parse-category-from-array.php:43:
array (size=1)
  64899 =>
    array (size=3)
      'IdP' => int 37671
      'Name' => string 'Auto-moto' (length=9)
      64868 =>
        array (size=3)
          'IdP' => int 64899
          'Name' => string 'Autochladničky' (length=15)
          64876 =>
            array (size=2)
              ...

Auto-moto
Auto-moto > Autochladničky
Auto-moto > Autochladničky > Kompresorové autochladničky
//Z tveho pole si cyklem vygenerujes pole se strukturou
$index_pole = array ($name1=>$row1, $name2=>$row2)

//A v tomto poli uz umis hledat, ne?
$index_pole['carp']['id']

Jestli hledas nejakou super bomba funkci, tak zkus array_filter. Myslim, ze v komentarich je neco podobneho. ale z example na even-odd by to asi slo taky napsat.
https://www.php.net/array_filter

Nahlásit jako SPAM
IP: 2001:718:2601:258:b0c7:f49a:1af4:4445...–
Kit+15
Guru
15. 7. 2021   #3
-
0
-

#1 fix
Proč nepoužiješ databázi nebo XML? Tam je to raz dva.

Nahlásit jako SPAM
IP: 85.160.44.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
15. 7. 2021   #4
-
0
-

Řekni to poskytovatelům toho API. Strukturu nemůžu měnit, co mi to API vrací, to mi vrací.

Zkusím si to složité pole zjednodušit jen na data, které mě zajímají oříznutím nezajímavého balastu, jak radí  peter. Pokud se do zítra neobjeví někdo s lepším nápadem, dnes už na to prdím.

Díky za tip.

Nahlásit jako SPAM
IP: 31.30.163.–
Kit+15
Guru
15. 7. 2021   #5
-
+1
-
Zajímavé
fix +

#4 fix
 

$carps = array_filter($array['data']['fishes'], function ($item) {
    return $item['name'] == 'carp';
};
Nahlásit jako SPAM
IP: 85.160.44.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
19. 7. 2021   #6
-
0
-

Díky, to funguje parádně. Ale stejně nejsem pořád schopný to modifikovat tak, aby mi to fungovalo pro rybu z databáze, nikoliv staticky vepsanou v kodu.

Zkoušel jsem takto, ale row is undefined, což asi chápu, že je to uvnitř té inline funkce a nevidí tu promennou:

$carps = array_filter($response['data']['fishes'], function ($item) { return $item['name'] == $row["fish"]; };

Můj poslední pokus vypadá takto, ale item is undefined, což je pochopitelné, protože ta externí funkce naopak nevidí ten item.

function ($item, $produkt) {
            return $item['name'] == $fish;
        }
        
$carps = array_filter($response['data']['fishes'], getDoaminsArray ($item, $row["fish"]));

Dalo by se to nějak prosím?

Můj způsob použití je vzít jméno ryby z databáze a vypsat jí váhu, která se vezme z toho array díky klíčovému slovu např. "carp".

Takže já se snažím udělat funkci VratVahu ("carp"); resp. abych byl přesný, tak VratVahu ($row["fish"]);

Nahlásit jako SPAM
IP: 31.30.163.–
Kit+15
Guru
19. 7. 2021   #7
-
+1
-
Zajímavé
fix +

#6 fix 

$carps = array_filter($array['data']['fishes'],
    function ($item) use ($row) {
        return $item['name'] == $row["fish"];
};
Nahlásit jako SPAM
IP: 85.160.40.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
30. 7. 2021   #8
-
0
-

Díky moc. Hodně mi to pomohlo, ale stejně jsem se s tím snad 2 hodiny sral, abych to nejak dokázal přizpůsobit, aby to šlo zapasovat domého kodu. BTW: Vůbec tenhle zjednodušený způsob programování v PHP neznám, říká se tomu nějak?

Nahlásit jako SPAM
IP: 92.240.177.–
Kit+15
Guru
30. 7. 2021   #9
-
0
-

#8 fix
Říká se tomu funkcionální programování (hledej map/filter/reduce). Uvnitř je anonymní funkce.

Nahlásit jako SPAM
IP: 213.175.51.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
1. 8. 2021   #10
-
0
-

Ted premyslim, jestli to moje chapes. Ja tm mam prave cyklus, ktery se vnoruje do hloubky toho pole. Cela ta finta spociva v tom, ze pouzivam 

foreach($list as $row)
{
$pom[ $id ] = &$pom[...]; nebo tam muze byt &$row
$pom[ $id ] = &$out[...]; 

Pro tebe je asi lepsi pouzit ten filter (mne se s tim nechtelo drbat, protoze sem to nikdy nepouzil).

Ten & odkazuje na pointer. Ty bys musel cely ten cyklus udelat tak, aby se zanoroval sam do sebe. Tak bys z cyklu udelal funkci, kde mas  

volej_cyklus($list, $out)
{
foreach($list as $row)
  {
  if (isset($row['id'])) {$out[] = &$row} // pripadne si tam dej jinou 
//strukturu nez puvodni $row, treba $out[] = array($row['id'], $row['name'])
// nebo $out[$row['id']] =  $row['name']
  else {volej_cyklus(&$row);}
  }
}

$list = array() ; // nejaka tva array, ja to necham prazdne, nechce se mi tva kopirovat
$out = array()
volej_cyklus($list, $out);

ale, je to v podstate to same, jak jsem poslal tomu druhemu manikovi, jen obalene funkci. A nevim jiste, jestli ty andy & mam spravne, protoze jsem to netestoval :) Ale, proste tak nejak by se z toho dal vycucat bezny tabulkovy seznam. Ten filter je sice super, ale jsou to take cykly a opakovane pouziti uz tak cool nebude :) Kdybys potreboval z te puvodni array jesne neco filtrovat, jako.
Nevim, no, ja takovym kostrukcim, jak napsali boreci kit moc neverim. U toho cyklu vim, co to dela a jsem schopny jej predelat, na co budu chtit :) A taky jsem schopny zjistit, co je spatne.

Nahlásit jako SPAM
IP: 193.84.198.–
peter
~ Anonymní uživatel
3981 příspěvků
2. 8. 2021   #11
-
0
-

   

<?php

function findByName(&$list, &$name, &$out)
{
foreach($list as $row)
  {
  if (!is_array($row)) {continue;}
  if (isset($row['id']) && isset($row['name']) && $row['name']==$name ) {$out[] = $row['id'];} // pripadne si tam dej jinou 
  else {findByName($row, $name, $out);}
  }
}

$list = array(
    'status' => "ok"
    ,'data' => Array
        (
            'fishes' => Array
                (
                    '0' => Array
                        (
                            'name' => "carp"
                            ,'id' => 1
                            ,'weight' => 35
                        )

                    ,'1' => Array
                        (
                            'name' => "silur"
                            ,'id' => 2
                            ,'weight' => 98
                        )
                    ,'3' => Array
                        (
                            'name' => "carp"
                            ,'id' => 11
                            ,'weight' => 35

                        ))));
$findName = "carp";
$founded = array();
findByName($list, $findName, $founded);
var_dump($founded);

?>

Dostal jsem se k tomu, predelat to. Udelal jsem to zrovna na tu vyhledavaci funkci

Nahlásit jako SPAM
IP: 2001:718:2601:258:4966:12b0:9235:7329...–
Kit+15
Guru
2. 8. 2021   #12
-
0
-

#11 peter
Proč dáváš do hlavičky funkce ty `&`? Vždyť tam nepatří.

Nahlásit jako SPAM
IP: 213.175.51.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
3. 8. 2021   #13
-
0
-

Pravda, nemusi tam byt, protoze to zkopiruje stejne ukazatele. Tam by asi melo vyznam jedine to pridat k row, kdyby se misto 

foreach($list as &$row)
...
//$out[] = $row['id'];
$out[] = $row;
...

Pak se da rici, ze ukazatel na puvodni pole by byl rychlejsi nez naklonovat vsechna data radku.

Nahlásit jako SPAM
IP: 2001:718:2601:258:38dc:d9e8:6f07:deae...–
Kit+15
Guru
3. 8. 2021   #14
-
0
-

#13 peter
Ani zde to nemá význam, zpracování to nijak nezrychlí.

Nahlásit jako SPAM
IP: 85.160.41.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Podobná vlákna

Jak pracovat s dvěma poli — založil Paja2

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý