Как вы переиндексировать массив в PHP?

У меня есть следующий массив, который я хотел бы переиндексировать, чтобы ключи поменялись местами (в идеале, начиная с 1):

Текущий массив (редактировать: массив на самом деле выглядит так):

Array (

[2] => Object
(
[title] => Section
[linked] => 1
)

[1] => Object
(
[title] => Sub-Section
[linked] => 1
)

[0] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)

)

Как это должно быть:

Array (

[1] => Object
(
[title] => Section
[linked] => 1
)

[2] => Object
(
[title] => Sub-Section
[linked] => 1
)

[3] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)

)

127

Решение

Если вы хотите переиндексировать, начиная с нуля, просто сделайте следующее:

$iZero = array_values($arr);

Если вам нужно, чтобы начать с одного, то используйте следующее:

$iOne = array_combine(range(1, count($arr)), array_values($arr));

Вот справочные страницы для используемых функций:

373

Другие решения

Вот лучший способ:

# Array
$array = array('tomato', '', 'apple', 'melon', 'cherry', '', '', 'banana');

это возвращает

Array
(
[0] => tomato
[1] =>
[2] => apple
[3] => melon
[4] => cherry
[5] =>
[6] =>
[7] => banana
)

делая это

$array = array_values(array_filter($array));

Вы получаете это

Array
(
[0] => tomato
[1] => apple
[2] => melon
[3] => cherry
[4] => banana
)

объяснение

array_values() Возвращает значения входного массива и численно индексирует.

array_filter() : Фильтрует элементы массива с помощью пользовательской функции (UDF Если ничего не предоставлено, все записи во входной таблице со значением FALSE будут удалены.)

50

Почему переиндексация? Просто добавьте 1 к индексу:

foreach ($array as $key => $val) {
echo $key + 1, '<br>';
}

редактировать   После выяснения вопроса: вы можете использовать array_values сбросить индекс, начиная с 0. Тогда вы можете использовать алгоритм, приведенный выше, если вы просто хотите, чтобы напечатанные элементы начинались с 1.

8

Я только что узнал, что вы также можете сделать

array_splice($ar, 0, 0);

Это делает переиндексацию на месте, поэтому вы не получите копию исходного массива.

8

Что ж, я хотел бы думать, что для любой вашей конечной цели вам на самом деле не нужно изменять массив, чтобы он был основан на 1, а не на 0, но вместо этого мог бы обрабатывать его во время итерации, как написал Гамбо.

тем не мение, чтобы ответить на ваш вопрос, эта функция должна конвертировать любой массив в версию на основе 1

function convertToOneBased( $arr )
{
return array_combine( range( 1, count( $arr ) ), array_values( $arr ) );
}

РЕДАКТИРОВАТЬ

Вот более многоразовая / гибкая функция, если хотите

$arr = array( 'a', 'b', 'c' );

echo '<pre>';
print_r( reIndexArray( $arr ) );
print_r( reIndexArray( $arr, 1 ) );
print_r( reIndexArray( $arr, 2 ) );
print_r( reIndexArray( $arr, 10 ) );
print_r( reIndexArray( $arr, -10 ) );
echo '</pre>';

function reIndexArray( $arr, $startAt=0 )
{
return ( 0 == $startAt )
? array_values( $arr )
: array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) );
}
6

Это будет делать то, что вы хотите:

<?php

$array = array(2 => 'a', 1 => 'b', 0 => 'c');

array_unshift($array, false); // Add to the start of the array
$array = array_values($array); // Re-number

// Remove the first index so we start at 1
$array = array_slice($array, 1, count($array), true);

print_r($array); // Array ( [1] => a [2] => b [3] => c )

?>
5

Более элегантное решение:

$list = array_combine(range(1, count($list)), array_values($list));

5

Вы можете переиндексировать массив, чтобы новый массив начинался с индекса 1 следующим образом;

$arr = array(
'2' => 'red',
'1' => 'green',
'0' => 'blue',
);

$arr1 = array_values($arr);   // Reindex the array starting from 0.
array_unshift($arr1, '');     // Prepend a dummy element to the start of the array.
unset($arr1[0]);              // Kill the dummy element.

print_r($arr);
print_r($arr1);

Выход из вышесказанного есть;

Array
(
[2] => red
[1] => green
[0] => blue
)
Array
(
[1] => red
[2] => green
[3] => blue
)
5
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector