2011-06-18 19 views
34

Mam tablicę takich jak:PHP - Get wartości tablicy z indeksu liczbowego

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
echo native_function($array, 0); // bar 
echo native_function($array, 1); // bin 
echo native_function($array, 2); // ipsum 

Tak, to natywna funkcja zwróci wartość na podstawie indeksu liczbowego (drugi Arg), ignorując klucze doc, szukając rzeczywista pozycja w tablicy.

Czy istnieje jakaś natywna funkcja do tego w PHP lub czy powinienem ją napisać? Dzięki

+3

To brzmi jak zły pomysł. Do czego to jest potrzebne? Czy nie byłoby lepiej, gdyby w tym przypadku istniały klucze numeryczne i wartość 'foo' jako członka pod-tablicy? –

+0

Też myślę, że to wygląda na zły projekt. Czy możesz nam powiedzieć, co próbujesz zrobić? Może jest lepsze rozwiązanie. – Alp

Odpowiedz

11

array_values() zrobi bardzo dużo, co chcesz:

$numeric_indexed_array = array_values($your_array); 
// $numeric_indexed_array = array('bar', 'bin', 'ipsum'); 
print($numeric_indexed_array[0]); // bar 
+0

... i od PHP 5.4 zmiażdż go do: print (array_values ​​($ your_array) [0]); – Pancho

77
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
$array = array_values($array); 
echo $array[0]; //bar 
echo $array[1]; //bin 
echo $array[2]; //ipsum 
4

Tak, dla wartości skalarnych, kombinacja implode i array_slice zrobi:

$bar = implode(array_slice($array, 0, 1)); 
$bin = implode(array_slice($array, 1, 1)); 
$ipsum = implode(array_slice($array, 2, 1)); 

Albo wymieszać z array_values i list (dzięki @nikic), dzięki czemu działa z wszystkimi typami wartości:

list($bar) = array_values(array_slice($array, 0, 1)); 
+0

+1 Chociaż użyłbym 'list ($ bar) = array_slice ($ array, 0, 1)' aby usunąć ograniczenie wartości skalarnej;) – NikiC

+0

@nikic: Pomyślałem o tym, niestety, 'tablica_slice' zachowa ciąg znaków klucze (nawet jeśli * preserve_keys * to * false *), więc nie możesz użyć 'list' w tym przypadku, chyba że' tablica_values' wynikową tablicę. W każdym razie myślę, że to także rozwiązanie, które zostało poddane edycji. Dzięki. – netcoder

4

Proponuję mój pomysł na ten temat w odniesieniu do każdej wady funkcji array_values(), ponieważ uważam, że nie jest to funkcja bezpośredniego pobierania. W ten sposób należy utworzyć kopię wartości liczbowo indeksowanych tablicy, a następnie dostęp. Jeśli PHP nie ukryje metody, która automatycznie tłumaczy liczbę całkowitą w pozycji pożądanego elementu, może nieco lepsze rozwiązanie może składać się z funkcji, która uruchamia tablicę z licznikiem, dopóki nie doprowadzi do pożądanej pozycji, a następnie zwraca osiągnięty element .

Tak więc praca byłaby zoptymalizowana dla bardzo dużej liczby rozmiarów, ponieważ algorytm byłby najlepszy dla małych wskaźników, natychmiast zatrzymując się. W rozwiązaniu podświetlonym na array_values(), ma to jednak związek z cyklem przepływającym przez całą macierz, nawet jeśli, na przykład, muszę uzyskać dostęp do tablicy $ [1].

function array_get_by_index($index, $array) { 

    $i=0; 
    foreach ($array as $value) { 
     if($i==$index) { 
      return $value; 
     } 
     $i++; 
    } 
    // may be $index exceedes size of $array. In this case NULL is returned. 
    return NULL; 
} 
+0

Ale co, jeśli "false" będzie wartością pobraną? Zwrócenie 'null' będzie nadal złe, ale lepsze niż' false'. – user619271

+0

Biorąc pod uwagę konsystencję tego typu, uzyskałbym wartość NULL lub jeśli wejściowy indeks przekroczy rozmiar tablicy lub jeśli wartość docelowa z indeksu wejściowego ma wartość NULL. W tym przypadku zgadzam się z tobą. Jednak FALSE i NULL dają ten sam wynik na funkcji empty(), która byłaby następną weryfikacją, którą można wykonać w dowolnym scenariuszu, ma sens wywołanie tej funkcji. –

Powiązane problemy