2010-11-08 1 views
0

Привет У меня есть массив, мне нужно изменить ключи упорядоченным образом, но не изменяйте порядок значений. напримерphp array re fillulate keys

$a = array (
0=>'h', 
1=>'blabla', 
2=>'yes' 
); 

Я использовал

unset($a[1]); 

но я нужен ключ, чтобы перезапустить вычисления ключей 0,1,2 ... etccc так что я не в конечном итоге с:

array(
0 => 'h', 
2 => 'yes' 
) 

, но он должен прийти возвращение:

array(
0 => 'h', 
1 => 'yes' 
) 

ответ

3

Вызов array_values на нем:

$a = array (
0=>'h', 
1=>'blabla', 
2=>'yes' 
); 

unset($a[1]); 

$a = array_values($a); 

var_dump($a); 
/* 
array(2) { 
    [0]=> 
    string(1) "h" 
    [1]=> 
    string(3) "yes" 
} 
*/ 
5

Вам необходимо применить array_values к вашему массиву для повторной индексации.

$a = array_values($a); 

Бонус: Если вам также необходимо заказать значения, которые вы можете использовать sort и это тоже будет повторно индексировать массив.

Примечание: Используя любой массив или значения, вы потеряете любые строковые ключи, которые у вас могут быть.

2

Вы также можете использовать array_splice() вместо снята с охраны(), который будет автоматически проиндексировать элементы массива:

$a = array (
0=>'h', 
1=>'blabla', 
2=>'yes' 
); 

array_splice($a,1,1); 

var_dump($a); 
+0

Но это немного излишним. Есть и другие функции, которые это сделают. Например, array_merge (для его случая). –

+1

Действительно ли это чрезмерное по сравнению с выполнением array_values ​​() сразу после unset()? –

+0

Предполагая, что он хочет уничтожить ровно один элемент, я думаю, это может быть немного быстрее с array_splice, но у меня нет серьезных доказательств. Также PHP не является языком, где скорость должна быть приоритетом :). Я дам вам +1 для вашего комбо-решения для отмены и повторной индексации. –