Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]explode rozbicie i porównanie, czy explode to dobry wybór?
casperii
post 20.06.2017, 19:30:25
Post #1





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 20.06.2017, 19:33:11
Post #2





Grupa: Zarejestrowani
Postów: 6 804
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


To chyba pytanie do Ciebie. Czy sprawdzasz tylko pierwszy znak, a resztę ignorujesz, czy też sprawdzasz każdy.


--------------------
Go to the top of the page
+Quote Post
casperii
post 20.06.2017, 19:35:15
Post #3





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


sprawdzam całość
Go to the top of the page
+Quote Post
trueblue
post 20.06.2017, 19:37:01
Post #4





Grupa: Zarejestrowani
Postów: 6 804
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


No, to w czym problem. Rozbiłeś, posortuj alfabetycznie i zastosuj 3 ify.


--------------------
Go to the top of the page
+Quote Post
bostaf
post 20.06.2017, 19:47:32
Post #5





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
casperii
post 20.06.2017, 19:49:02
Post #6





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post 20.06.2017, 19:59:33
Post #7





Grupa: Zarejestrowani
Postów: 6 804
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A będzie sytuacja, że jest ZY, YZX, YX, itp., czyli zamieniona kolejność? Jeśli tak, to czy kolejność ma znaczenie dla wykonywania operacji?


--------------------
Go to the top of the page
+Quote Post
casperii
post 20.06.2017, 20:06:47
Post #8





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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';




Ten post edytował casperii 20.06.2017, 20:09:00
Go to the top of the page
+Quote Post
trueblue
post 20.06.2017, 20:19:20
Post #9





Grupa: Zarejestrowani
Postów: 6 804
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


To zamiast rozbijać zastosuj http://php.net/manual/en/function.strpos.php


--------------------
Go to the top of the page
+Quote Post
bostaf
post 20.06.2017, 20:47:08
Post #10





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
casperii
post 20.06.2017, 20:51:31
Post #11





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


@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
Go to the top of the page
+Quote Post
bostaf
post 20.06.2017, 20:58:26
Post #12





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
casperii
post 28.06.2017, 21:12:41
Post #13





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 29.06.2017, 08:31:53
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


No i co?
Go to the top of the page
+Quote Post
casperii
post 7.07.2017, 20:40:13
Post #15





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
trueblue
post 7.07.2017, 20:51:33
Post #16





Grupa: Zarejestrowani
Postów: 6 804
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A nie wystarczy Ci GROUP_CONCAT tylko dla adresów?


--------------------
Go to the top of the page
+Quote Post
casperii
post 7.07.2017, 20:54:13
Post #17





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


Nie wystarczy, bo dla poszczególnego konta - jest przypisany adres
Go to the top of the page
+Quote Post
trueblue
post 7.07.2017, 21:04:11
Post #18





Grupa: Zarejestrowani
Postów: 6 804
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
casperii
post 7.07.2017, 21:13:45
Post #19





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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`
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 08:11