Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] funkcja do szukania w tablicy
adam45
post 29.06.2015, 22:18:35
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 28.06.2015

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


mam taka funkcje do wyszukiwania w tablicy, tablica wyglada mniej wiecej jak ponizej,
funkcja dziala prawidlowo, problem jest w tym że tablica jest bardzo duza, ma kilkaset tysiecy indeksów i dziala to wszystko bardzo wolno

czy da sie to zrobic w jakis szybszy sposob niz ja to zrobilem

  1. function wyszukaj($tablica, $numer)
  2. {
  3.  
  4. foreach($tablica as $nazwa_kolumny=>$wartosc) {
  5.  
  6. if($wartosc["numer"] == $numer)
  7. {
  8. $tmp = $wartosc["kolor"];
  9. break;
  10. }
  11. }
  12.  
  13. return $tmp;
  14.  
  15. }


Kod
Array
(
    [0] => Array
        (
            [numer] => 2345
            [kolor] => zielony
        )

    [1] => Array
        (
            [numer] => 7554
            [kolor] => bialy
        )


Ten post edytował adam45 29.06.2015, 22:20:55
Go to the top of the page
+Quote Post
tomxx
post 29.06.2015, 22:50:46
Post #2





Grupa: Zarejestrowani
Postów: 172
Pomógł: 27
Dołączył: 5.10.2013

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


Jeżeli numery są unikatowe, to łatwiej będzie dać je jako indeksy, czyli:
  1. [2345 => 'zielony', 7554 => 'bialy']
Potem odwołujesz się bezpośrednio, np. echo $tablica[2345];
Go to the top of the page
+Quote Post
kreatiff
post 29.06.2015, 22:51:39
Post #3





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


Czy możesz zmodyfikować tablicę? Jeśli numer jest unikalny, to zrób z niej tablicę [2345 => 'zielony', 7554 => 'biały'] i problem załatwiony (przedmówca mnie uprzedził smile.gif). A jeśli nie, to ciężko będzie to przyspieszyć. Przerób to na bazę danych, choćby SQLite w :memory: i szukaj zapytaniami.

Dodam jeszcze garść pomysłów od innych, porób testy, może coś będzie bardziej wydajne: http://stackoverflow.com/questions/6661530...al-array-search

Ten post edytował kreatiff 29.06.2015, 22:54:35
Go to the top of the page
+Quote Post
kartin
post 29.06.2015, 22:59:47
Post #4





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


  1. if (!function_exists('array_column')) {
  2.  
  3. function array_column($tablica, $kolumna) {
  4.  
  5. return array_map(function($element) use($kolumna) {
  6. return $element[$kolumna];
  7. }, $tablica);
  8. }
  9.  
  10. }
  11.  
  12. function wyszukaj($tablica, $numer) {
  13. return $tablica[array_search($numer, array_column($tablica, 'numer'))]['kolor'];
  14. }


Jak masz PHP w wersji co najmniej 5.5.0, to możesz pominąć if.


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
tomxx
post 30.06.2015, 08:21:00
Post #5





Grupa: Zarejestrowani
Postów: 172
Pomógł: 27
Dołączył: 5.10.2013

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


Tak w ogóle, to do takich rzeczy używa się baz danych. Wtedy wszelkie tego typu operacje są bardzo łatwe i szybkie, nie trzeba bawić się w funkcje i szukanie.
Go to the top of the page
+Quote Post
rad11
post 30.06.2015, 08:34:30
Post #6





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


http://stackoverflow.com/questions/6661530...al-array-search
Go to the top of the page
+Quote Post
Pyton_000
post 30.06.2015, 08:42:47
Post #7





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

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


A co Wy żeście się z tą BD tak uczepili. Koleś może dostaje tablice z API albo z gotowego pliku czy coś.
Go to the top of the page
+Quote Post
Puszy
post 3.07.2015, 15:27:31
Post #8





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Cytat(Pyton_000 @ 30.06.2015, 09:42:47 ) *
A co Wy żeście się z tą BD tak uczepili. Koleś może dostaje tablice z API albo z gotowego pliku czy coś.


Racja. Ale jeżeli operacja nie jest wykonywana często a same dane nie zajmują wiele to może cacheować to w SLQu czy też na czas trwanai skryptu tworzyć tymczasową tabelę. Może akurat w tym przypadku nie będzie to opłacalne ale zostawia furtkę na ewentualną przyszłą rozbudowę.
Go to the top of the page
+Quote Post
adam45
post 5.07.2015, 21:01:44
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 28.06.2015

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


jak sie zawsze okazuje najprostrze rozwiązania są najlepsze, ja niestety zawsze wymyslam cos skomplikowanego

zrobienie indeksow z numerow i pozniej odwolanie sie do ich wartosci najlepiej sie sprawdzilo
z kilku dziesieciu minut czas skrocił sie do niecałej sekundy
Kod
    [2345 => 'zielony', 7554 => 'bialy']


testowalem tez to, ale nie za bardzo poprawilo to wydajnowsc wzgledem teo co juz mialem
Kod
function wyszukaj($tablica, $numer) {
    return $tablica[array_search($numer, array_column($tablica, 'numer'))]['kolor'];


nie zawsze jest mozliwosc zrobienia indeksow z jakis tam danych, w moim przypadku akurat bylo to mozliwe
dzieki wszystkim za sugestie


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: 27.04.2024 - 10:14