2010-05-31 21 views
7

Korzystanie z zastrzeżonych ramy, ja często znajduję się w sytuacji, w której otrzymuję zestaw wyników z bazy danych w następującej formie:PHP tablice: pop tablicy tablic pojedynczych elementów na jednej tablicy

array(5) { 
    [0] => array(1) { 
    ["id"] => int(241) 
    } 
    [1] => array(1) { 
    ["id"] => int(2) 
    } 
    [2] => array(1) { 
    ["id"] => int(81) 
    } 
    [3] => array(1) { 
    ["id"] => int(560) 
    } 
    [4] => array(1) { 
    ["id"] => int(10) 
    } 
} 

Wolałbym mieć pojedynczą tablicę identyfikatorów, takich jak:

array(5) { 
    [0] => int(241) 
    [1] => int(2) 
    [2] => int(81) 
    [3] => int(560) 
    [4] => int(10) 
} 

Aby się tam dostać, ja często znajduję się pisząc:

$justIds = array(); 
foreach($allIds as $id) { 
    $justIds[] = $id["id"]; 
} 

Czy jest to skuteczniejszy sposób?

+1

Czy używasz dobrej metody? W większości frameworków istnieją metody takie jak fetchCol() do obsługi 1-dimensonal specjalnych przypadków ... – greg0ire

+0

Jest to metoda dostępna w stylu fetchCol(), ale w wielu przypadkach nie kontroluję tego, co faktycznie pobiera informacje z bazy danych (wywołania API itp.). –

Odpowiedz

9
$out = array_map('array_shift', $in); 

np.

$in = array(
    array("id" => 241), 
    array ("id" => 2), 
    array ("id" => 81), 
    array ("id" => 560), 
    array ("id" => 10) 
); 
$out = array_map('array_shift', $in); 
var_dump($out); 

drukuje

array(5) { 
    [0]=> 
    int(241) 
    [1]=> 
    int(2) 
    [2]=> 
    int(81) 
    [3]=> 
    int(560) 
    [4]=> 
    int(10) 
} 
+0

Prawdopodobnie bardziej wydajne byłoby użycie 'reset' zamiast tego, ponieważ' array_shift' zmienia przekazaną tablicę. EDYCJA: po prostu przetestowane, używając "reset" daje 6% poprawy z twoim przykładem na mojej wersji debugowania systemu Windows. – Artefacto

+0

Jak wyglądałoby rozwiązanie resetujące? –

+0

Wystarczy zastąpić 'array_shift' przez' reset'. – VolkerK

6

Z PHP 5.3 można zrobić

$justIds = array_map(
    function($cur) { 
     return $cur['id']; 
    }, 
    $allIds 
); 

Z PHP < 5,3 musiałbyś zdefiniować regularną funkcję, a następnie podać nazwę jako ciąg array_map ().

+0

Właściwie wersja VolkerK z array_shift może być ładniejsza niż mój niestandardowy oddzwonień – johannes

+0

Z drugiej strony ta wersja działa, nawet jeśli tablica wejściowa zawiera tablice z więcej niż jednym elementem, niezależnie od kolejności. +1 – VolkerK

+0

Zaznaczam, że VolkerK jest najlepszą odpowiedzią, ponieważ odnosi się do konkretnego przykładu, ale jest wystarczająco dużo czasu, w którym będę musiał obsłużyć wieloelementowe podprzestrzenie, że będę mógł dodać obie techniki do mojego arsenału. Dzięki wam oboje! –

Powiązane problemy