Multidimenzionální asociativni pole – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Multidimenzionální asociativni pole – PHP – Fórum – Programujte.comMultidimenzionální asociativni pole – PHP – Fórum – Programujte.com

 

Lynx
~ Anonymní uživatel
5 příspěvků
1. 10. 2014   #1
-
0
-

Dobrý den,

momentálně pracuji s multidimenzionálním asociativním polem a asi nějak nerozumím tomu, jak to přesně funguje. Nevim presne jak formulovat muj problem, tak ho zkusim popsat na mem konkretnim prikladu.

Mam seznam lokalit, uzivatelu a sluzeb. Kazde sluzbe v kazde lokalite je prirazen nejaky uzivatel. Ja chci kazdemu uzivateli pro kazdou lokalitu priradit ke kazde sluzbe hodnotu 0 nebo 1 (pro nasledne zobrazeni v tabulce). Pro predstavu uvedu priklad, jak by mela tabulka vypadat.

                                            Sluzba1          Sluzba2         Sluzba3

Uzivatel1   lokalita1                  1                     0                    0

Uzivatel2   lokalita1                  0                     1                    1

Uzivatel1   lokalita2                  0                     0                    1

Uzivatel2   lokalita2                  1                     1                    0

Kod, ktery prirazuje hodnoty jednotlivym sluzbam pro dane uzivatele dane lokality.

        $localities = $this->model->getLocalities();
        $services = $this->model->getServices();

foreach($localities as $locality) {

            $locality['users'] = $this->model->getItWorkers();
            foreach($locality['users'] as $user) {
                
                $responsibilities = $this->model->getResponsibilities($user->id);
                foreach ($services as $service) {
                    $user['service'][$service->name] = 0;
                    foreach ($responsibilities as $responsibility) {
                        if ($service->name == $responsibility->service) {
                            $user['service'][$service->name] = 1;
                            break;
                        }
                    }
                   
                }                 
            }
        }

A ted kde je teda problem. Kod vyse nefunguje. Pokud si dumpnu napr. var_dump($localities[0]['users']) po vykonani skriptu, klic 'services' v poli neni.

Pokud vsak kod napisu takto:

        $localities = $this->model->getLocalities();
        $services = $this->model->getServices();

foreach($localities as $locality) {

            $locality['users'] = $this->model->getItWorkers();
            foreach($locality['users'] as $user) {
                
                $responsibilities = $this->model->getResponsibilities($user->id);
		$var = $user['services'];
                foreach ($services as $service) {
                    $var[$service->name] = 0;
                    foreach ($responsibilities as $responsibility) {
                        if ($service->name == $responsibility->service) {
                            $var[$service->name] = 1;
                            break;
                        }
                    }
                   
                } 
		$user['services'] = $var;                
            }
        }

Tak kod funguje tak jak ma. Mohl by mi prosim nekdo osvetlit, jak je to mozne?

Nahlásit jako SPAM
IP: 194.12.35.–
peter
~ Anonymní uživatel
4014 příspěvků
1. 10. 2014   #2
-
0
-

Zkus si zapnout error_reporting. Mozna ti to hlasi nejakou chybu.

Pri zbeznem pohledu mne napada, ze nemuzes prirazovat jako do pole hodnotu, pokud dane pole jeste neexistuje.
$user['service'][$service->name] = 0;
Nikde driv ale nemas definovane
$user['service'] = cokoliv // treba array();
takze to vyhlasi error $user['service'] undefined, hadam, a ignoruje to ten kod.

Kdezto druhy kod ma
$var = $user['services']; ,
ktery vytvori $user['services'], ulozi hodnotu null a priradi do promene link na do pole. Dal se to pak uz pretypuje na pole pri prirazeni dalsi hodnoty v kaskade. Mozna by tedy stacilo misto toho cokoliv jen napsat $user['service'];
 

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:8dd8:41...–
crazy
~ Moderátor
+10
Grafoman
1. 10. 2014   #3
-
0
-

#1 Lynx
zkus tvůj kód upravit takto:

$localities = $this->model->getLocalities();
        $services = $this->model->getServices();

foreach($localities as &$locality) {

            $locality['users'] = $this->model->getItWorkers();
            foreach($locality['users'] as &$user) {
                
                $responsibilities = $this->model->getResponsibilities($user->id);
                foreach ($services as $service) {
                    $user['service'][$service->name] = 0;
                    foreach ($responsibilities as &$responsibility) {
                        if ($service->name == $responsibility->service) {
                            $user['service'][$service->name] = 1;
                            break;
                        }
                    }
                   
                }                 
            }
        }

pokud ti tvůj model vrací pole, tak by to mělo fungovat.

Nahlásit jako SPAM
IP: 89.103.111.–
All you need is vision and time.
kriplozoik
~ Anonymní uživatel
16 příspěvků
30. 10. 2014   #4
-
0
-

Tohle 

$array = (1, 2, 3);
foreach($array as $key => $value){
	$value += 1;
}
var_dump($array);

vypíše (1, 2, 3). S nahrazením "$key => &$value" to teprve přestane 'ztrácet' uvnitř foreach() hodnoty.

Nahlásit jako SPAM
IP: 94.112.250.–
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ů

 

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