Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]explode rozbicie i porównanie
Forum PHP.pl > Forum > Przedszkole
casperii
Panowie mamy kod:
Rozbijam zmienną $expl wyciąganą z bazy, gdzie czasem może być samo X, czasem X, Y a czasami X , Y, Z.
Zastanawiam się, czy dobrym sposobem jest zastosowanie funkcji explode i rzucanie tego do tablicy , ponieważ X , Y, Z może mieć zarówno expl[0] jak i expl[1] jak i expl[2]
  1.  
  2. $expl = explode(",", $row['name']); //będzie zawierać X, Y, Z
  3. $exy = $expl[0];
  4. $exy = $expl[1];
  5. $exy = $expl[2];
  6.  


A chciałbym osiągnąć cel if $zmienna = X rób coś tam , if $zmienna Y rób coś innego, if $zmienna Z rób zupełnie coś innego.
trueblue
To chyba pytanie do Ciebie. Czy sprawdzasz tylko pierwszy znak, a resztę ignorujesz, czy też sprawdzasz każdy.
casperii
sprawdzam całość
trueblue
No, to w czym problem. Rozbiłeś, posortuj alfabetycznie i zastosuj 3 ify.
bostaf
Cytat(casperii @ 20.06.2017, 20:30:25 ) *
gdzie czasem może być samo X, czasem X, Y a czasami X , Y, Z.

Fsensie $row['name'] może zawierać dwa przecinki, jeden lub żadnego? Ale X będzie zawsze, Y czasami, a Z też czasami ale zawsze w komplecie z Y?
casperii
No tak tylko , że czasami Z będzie mieć $expl[0] w przypadku jeśli nie będzie X , Y ,a czasami Z będzie mieć $expl[1] jeśli będzie X i co warunki robić ? smile.gif
trueblue
A będzie sytuacja, że jest ZY, YZX, YX, itp., czyli zamieniona kolejność? Jeśli tak, to czy kolejność ma znaczenie dla wykonywania operacji?
casperii
X , Y , Z = to przykładowe dane (to będą skróty trzyliterowe), dla każdego ze skrótu w zależności jeśli istnieje chce nadać inny kolor.
W bazie na pole mam ustawione enum więc raczej nie powinno być pisania w spak, więc kombinacje jakie mogą być to :
X
X, Y
X, Y, Z
Y, Z
Z
X, Z
etc.

na razie kombinuje coś w ten deseń:
  1. $expl = explode(",", $row['name']);
  2. if($expl[0] == 'X') $ValX = 'X';


trueblue
To zamiast rozbijać zastosuj http://php.net/manual/en/function.strpos.php
bostaf
Cytat(trueblue @ 20.06.2017, 21:19:20 ) *
To zamiast rozbijać zastosuj http://php.net/manual/en/function.strpos.php

Heh, właśnie próbuję zrobić do tego onelinera wykorzystując strpos smile.gif

W międzyczasie coś takiego mi przyszło do głowy:
  1. extract(array_flip(explode(',', $row['name'])));
  2. $X = isset($X);
  3. $Y = isset($Y);
  4. $Z = isset($Z);
  5. var_dump($X, $Y, $Z);


Ale tak czy inaczej, po pierwsze to bym się zastanowił nad strukturą danych w bazie. To co masz w tej chwili jest sprzeczne z zasadami normalizacji, a konkretnie z pierwszą postacią normalną 1NF - jedno pole w bazie powinno zawierać atomową, niepodzielną informację.
casperii
@bostaf to pole jest wynikiem zastosowania GROUP_CONCAT
Sądzę, że chyba optymalnym i najmniej skomplikowanym rozwiązaniem będzie zastosowanie funkcji strpos , którą zaproponował @trueblue
bostaf
Cytat(casperii @ 20.06.2017, 21:51:31 ) *
Sądzę, że chyba optymalnym i najmniej skomplikowanym rozwiązaniem będzie zastosowanie funkcji strpos , którą zaproponował @trueblue

i najbardziej czytelnym dla kogoś, kto by przejął Twój kod w przyszłości. Ja dla zabawy coś innego próbowałem wykombinować smile.gif Bierz strpos.
casperii
A co jeśli chciałbym rozbić od 1 - 3 losowo wybrane ciągi liczb ?

np może być:
1254,4567,84132
2122,55151
6812
Pyton_000
No i co?
casperii
No dobra a jeśli miał by coś takiego:

  1. SELECT GROUP_CONCAT(c.konto) AS `konto`, GROUP_CONCAT(`c`.`adres`) AS `adres` FROM `konta` AS p LEFT JOIN `adresy` AS c ON `c`.`aid` = `p`.`pid` GROUP BY `p`.`pid`


to jak dla tabeli konto (jeśli znam nazwy kont) - mogę zrobić tak:

  1. $konto1 = stripos($konto, $pierwszy);


tak dla tabeli drugiej adresy nic mi normalnego nie przychodzi do głowy, ponieważ druga tabela jest zależna od pierwszej.
explode chyba odpada ponieważ , dany adres może być zarówno dla konto1, jak i dla konto2, ale może być i tylko dla konto3.
Ktoś ma pomysł ?

Przykład jaki chce osiągnąć:
Marek: adres1, adres2, adres3
Jarek: adres3
Franek: adres1, adres3
Krzysztof: adres2, adres3

trueblue
A nie wystarczy Ci GROUP_CONCAT tylko dla adresów?
casperii
Nie wystarczy, bo dla poszczególnego konta - jest przypisany adres
trueblue
A co to zmienia? Grupujesz po kontach, a GROUP_CONCAT dla adresów. Dokładnie taki efekt uzyskasz jak pokazałeś, bez potrzeby "rozklejania" kont, bo będą to odrębne rekordy.
casperii
Hmm czyli twoim zdaniem powinno być:
  1. SELECT c.konto AS konto, GROUP_CONCAT(`c`.`adres`) AS `adres` FROM `konta` AS p LEFT JOIN `adresy` AS c ON `c`.`aid` = `p`.`pid` GROUP BY `p`.`pid`
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.