Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php]Usuwanie pierwszego elementu tablicy?, jednak array_shift() rozburza mi klucze
kukix
post
Post #1





Grupa: Zarejestrowani
Postów: 600
Pomógł: 2
Dołączył: 1.09.2002
Skąd: Wrocław

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


Witam.

Mam tablice generowaną automatycznie, jednak potrzebuje, żeby nie miała ona więcej niż 5 elementów.

Podczas dodawania elementu do tablicy sprawdzam, czy ma powyżej 5 elementów i jeżeli ma to kasuje je funkcją array_shift();

Po ciężkiej walce okazało się, że array_shift() modyfikuje mi klucze pozostałych tablic...

W jaki sposób mogę kontrolować czy tablica ma 5 elementów.. i kasować najstarszy?
Myślałem o pętli foreach(), ale może jest jakis wbudowany w php mechanizm?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Na szybko:
  1. <ul>
  2. <?php
  3. $temp = array('a' => 'gs', 'b' => 'ddr', 'c' => 'sdfsf');
  4. $time_start = microtime(true);
  5. for($i = 0; $i < 100000; $i++)
  6. {
  7. if(count($temp) > 4)
  8. {
  9. reset($temp);
  10. $key = key($temp);
  11. unset($temp[$key]);
  12. }
  13. $temp[$i] = 'ggsggstr';
  14. }
  15. $time_end = microtime(true);
  16. ?>
  17. <li>100k razy z resetem = <?php echo ($time_end - $time_start).' -> '.print_r($temp, TRUE); ?></li>
  18. <?php
  19. $temp = array('a' => 'gs', 'b' => 'ddr', 'c' => 'sdfsf');
  20. $time_start = microtime(true);
  21. for($i = 0; $i < 100000; $i++)
  22. {
  23. if(count($temp) > 4)
  24. {
  25. $temp = array_slice($temp, 1, 4, TRUE);
  26. }
  27. $temp[$i] = 'ggsggstr';
  28. }
  29. $time_end = microtime(true);
  30. ?>
  31. <li>100k razy z array_slice = <?php echo ($time_end - $time_start).' -> '.print_r($temp, TRUE); ?></li>
  32. </ul>

Z wynikiem:
Kod
100k razy z resetem = 2.9823479652405 -> Array ( [99995] => ggsggstr [99996] => ggsggstr [99997] => ggsggstr [99998] => ggsggstr [99999] => ggsggstr )
100k razy z array_slice = 2.085914850235 -> Array ( [99995] => ggsggstr [99996] => ggsggstr [99997] => ggsggstr [99998] => ggsggstr [99999] => ggsggstr )

Jak widać array_slice jest około 30% szybsze rozwiązanie i na pewno daje identyczny wynik w obu wypadkach, co widać po indeksach.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 23.08.2025 - 05:53