2013-01-17 17 views
9

Oto tablica mam:Rewers wartości tablicy zachowując klucze

$a = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5'); 

Co chciałbym zrobić, to odwrócić wartości tablicy zachowując klucze nienaruszone, innymi słowy powinno to wyglądać tak :

$a = array('a' => 'a5', 'b' => 'a4', 'c' => 'a3', 'd' => 'a2', 'e' => 'a1'); 

Jak powinienem to zrobić?

P.S. Próbowałem za pomocą array_reverse() ale nie wydają się działać

+0

Jest całkiem fajne, że jest to możliwe, a na dole widząc go jako jeden liner jest cool. Jaki byłby przypadek użycia, w którym chcesz zachować te same klucze, ale odwrócić dane? –

Odpowiedz

23

Niektóre krok po kroku przetwarzania z wykorzystaniem natywnych funkcji PHP (może to być skompresowane z mniej zmienne):

$a = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5'); 

$k = array_keys($a); 
$v = array_values($a); 

$rv = array_reverse($v); 

$b = array_combine($k, $rv); 

var_dump($b); 

Wynik:

array(5) { 
    'a' => 
    string(2) "a5" 
    'b' => 
    string(2) "a4" 
    'c' => 
    string(2) "a3" 
    'd' => 
    string(2) "a2" 
    'e' => 
    string(2) "a1" 
} 
+0

+1 dla dokładnego przykładu, a szybka odpowiedź – pzirkind

+5

array_reverse ma faktycznie drugi argument 'zachowaj klucze', które robią dokładnie to samo w jednym wywołaniu. '$ rv = array_reverse ($ v, true);' – lifecoder

+1

@lifecoder Brakuje centralnego punktu pytania: Klucze NIE powinny być odwrócone, tylko wartości. – Sven

7

Jest to możliwe dzięki zastosowaniu array_combine, array_values, array_keys i array_values. Może wydawać się strasznie dużo funkcji dla prostego zadania, i może być jednak łatwiejsze sposoby.

array_combine(array_keys($a), array_reverse(array_values($a))); 
+0

+1 Dzięki za szybką odpowiedź – pzirkind

+0

Twoja linijka jest naprawdę zadbana, dzięki za nauczenie mnie! – pzirkind

0

będzie to zrobić to (Właśnie napisałem to, demo here):

<?php 
function value_reverse($array) 
{ 
    $keys = array_keys($array); 
    $reversed_values = array_reverse(array_values($array), true); 
    return array_combine($keys, $reversed_values); 
} 

$a = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5'); 

print_r(value_reverse($a)); 
+0

+1 dziękuję za funkcję – pzirkind

+1

Funkcja miała literówki, naprawiono ją – guidod

+0

@guidod Twoja edycja była poprawna, ale __ _ sugerowane zmiany są odrzucane. Więcej dyskusji na ten temat można znaleźć w [to pytanie] (http://meta.stackoverflow.com/questions/252806/when-should-i-edit-something-vs-comment-on-it-ifits- a-stosunkowo-trywialny-błąd) na meta – Alik

1

Oto inny sposób;

$keys = array_keys($a); 
$vals = array_reverse(array_values($a)); 
foreach ($vals as $k => $v) $a[$keys[$k]] = $v; 
1

myślę, że to powinno działać ..

<?php 
$old = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5'); 
$rev = array_reverse($old); 

foreach ($old as $key => $value) { 
    $new[$key] = current($rev); 
    next($rev); 
} 

print_r($new); 
?> 
Powiązane problemy