2013-07-20 18 views
7

Czy istnieje lekki zamiennik dla PHP array do użycia, gdy nie potrzebuję żadnej z powiązanych funkcji tablicy? Z tego, co wiem, array jest wewnętrzną tablicą skrótów, która jest nadmierna i nieefektywna do przechowywania prostej tablicy elementów. Gdyby PHP posiadało klasę lub programowanie podobne do C++ 's std::vector, byłoby po prostu świetne.Czy istnieje odpowiednik std :: vector C++ w PHP?

referencyjny: http://www.cplusplus.com/reference/vector/vector/

+5

Od [dokumentacja] (http://php.net/manual/language.types.array.php): ** [PHP są tablice] zoptymalizowane dla kilku różnych używa; może być traktowany jako tablica, lista (wektor), tablica asocjacyjna (implementacja mapy), słownik, kolekcja, stos, kolejka i prawdopodobnie więcej. ** Co próbujesz zrobić, szczególnie, gdy tablice powodują masz kłopoty? –

+0

W szczególności, PHP "array" jest zaimplementowana jako jednocześnie lista hashtable i podwójnie związana. Chociaż oznacza to, że operacje wstawiania i usuwania niosą niewielki dodatkowy koszt w celu utrzymania różnych wskaźników, pobieranie wszelkiego rodzaju jest dość mocno zoptymalizowane. – IMSoP

+0

@IMSoP Więc nie tylko macierzyste tablice PHP są nieefektywne pod względem czasu, ale także pod względem pamięci? –

Odpowiedz

9

Wystarczy popatrzeć na SPL datastructures. Przykładem jest http://www.php.net/manual/en/class.splfixedarray.php, który jest szybszy niż zwykła tablica.

http://www.php.net/manual/en/spl.datastructures.php

+4

SPLFixedArray jest szybszy niż standardowe tablice PHP dla dostępu losowego; frakcyjnie wolniejsze dla dostępu sekwencyjnego (na przykład foreach()); ale daje duże oszczędności pamięci. Odwrotnie, SPLDoublyLinkedLists są szybsze niż standardowe macierze PHP dla sekwencyjnego dostępu - i dobrze jest zobaczyć dane o polecanych bazodach SPL –

+0

+1 dobre informacje – DevZer0

+2

Naprawiono błąd SplFixedArray. ['std :: vector'] (http://www.cplusplus.com/reference/vector/vector/) nie jest. – Gordon

3

Nie, PHP nie ma ścisły odpowiednik std::vector.

Po prostu użyć nasz multi-purpose arrays lub jeden z additional datastructures in SPL, mianowicie SplFixedArray, ArrayObject a niektóre Heaps i Stacks, ale żaden z nich są rzeczywiście równoważne.

Najbliżej co mogę myśleć, aby zaoszczędzić pamięć jest PECL extension for Judy Arrays:

PHP Judy realizuje rozrzedzone tablice dynamiczne (aka Judy podgrupach). To rozszerzenie jest oparte na bibliotece Judy C. Tablica Judy pobiera pamięć tylko wtedy, gdy jest zapełniona, ale może rosnąć, aby w razie potrzeby wykorzystać całą dostępną pamięć. Najważniejsze zalety Judy to skalowalność, wysoka wydajność i wydajność pamięci.

obsługuje następujące tryby:

  • BITSET - Definiowanie Array Judy jako Bitset z kluczy jako całkowitą i wartości jako Boolean
  • INT_TO_INT - Definiowanie Array Judy z klucz/wartości jako Integer i Integer only.
  • INT_TO_MIXED - Definiuj Judy Array za pomocą kluczy jako Integer i Wartości dowolnego typu.
  • STRING_TO_INT - Zdefiniuj tablicę Judy z kluczami jako ciągiem i wartościami całkowitymi i całkowitymi.
  • STRING_TO_MIXED - Zdefiniuj Judy Array za pomocą kluczy jako łańcucha i wartości dowolnego typu.

Prawdopodobnie chcesz INT_TO_MIXED. Tak jak powiedziałem, to jest najbliższe, o czym mogę pomyśleć. To nie to samo. Nigdy wcześniej go nie używałam, więc nie mogę powiedzieć, czy spełnia twoje wymagania pod względem wydajności.

Można przeglądać źródłowego na http://lxr.php.net/xref/PECL/Judy/