Как вы переиндексируете массив в PHP?
У меня есть следующий массив, который я хотел бы переиндексировать, чтобы клавиши были отменены (в идеале начиная с 1):
Текущий массив ( edit: массив выглядит так:)
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] =>
)
)
Ответы
Ответ 1
Если вы хотите переиндексировать начало с нуля, просто выполните следующие действия:
$iZero = array_values($arr);
Если вам нужно, чтобы он начинался с одного, используйте следующее:
$iOne = array_combine(range(1, count($arr)), array_values($arr));
Вот страницы руководства для используемых функций:
Ответ 2
Вот лучший способ:
# 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 будут удалены.)
Ответ 3
Почему переиндексация? Просто добавьте 1 к индексу:
foreach ($array as $key => $val) {
echo $key + 1, '<br>';
}
Изменить. После того, как вопрос будет уточнен: вы можете использовать array_values
to reset индекс, начинающийся с 0. Затем вы можете использовать вышеприведенный алгоритм, если хотите просто начать печатные элементы при 1.
Ответ 4
Я только что узнал, что вы также можете сделать
array_splice($ar, 0, 0);
Это делает повторную индексацию inplace, поэтому вы не получаете копию исходного массива.
Ответ 5
Хорошо, мне хотелось бы думать, что для любой цели, на самом деле вам не нужно было бы изменять массив, чтобы он был основан на 1, а не на основе 0, но вместо этого мог обрабатывать его на итерационном времени, таком как Gumbo вывешенным.
Однако, чтобы ответить на ваш вопрос, эта функция должна преобразовывать любой массив в 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 )
?>
Ответ 7
Более элегантное решение:
$list = array_combine(range(1, count($list)), array_values($list));
Ответ 8
Вы можете переиндексировать массив, чтобы новый массив начинался с индекса 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
)
Ответ 9
Возможно, вам захочется рассмотреть, почему вы хотите использовать массив на основе 1. Массивы с нулевым значением (при использовании неассоциативных массивов) довольно стандартизированы, и если вы хотите выводить на пользовательский интерфейс, большинство из них будут обрабатывать решение, просто увеличивая целое число после вывода в пользовательский интерфейс.
Подумайте о согласованности - как в своем приложении, так и в коде, с которым работаете - когда думаете о индексаторах на основе 1 для массивов.
Ответ 10
Подобно @monowerker, мне нужно было переиндексировать массив, используя ключ объекта...
$new = array();
$old = array(
(object)array('id' => 123),
(object)array('id' => 456),
(object)array('id' => 789),
);
print_r($old);
array_walk($old, function($item, $key, &$reindexed_array) {
$reindexed_array[$item->id] = $item;
}, &$new);
print_r($new);
В результате получилось:
Array
(
[0] => stdClass Object
(
[id] => 123
)
[1] => stdClass Object
(
[id] => 456
)
[2] => stdClass Object
(
[id] => 789
)
)
Array
(
[123] => stdClass Object
(
[id] => 123
)
[456] => stdClass Object
(
[id] => 456
)
[789] => stdClass Object
(
[id] => 789
)
)
Ответ 11
$tmp = array();
foreach (array_values($array) as $key => $value) {
$tmp[$key+1] = $value;
}
$array = $tmp;
Ответ 12
Если вы не пытаетесь изменить порядок массива, вы можете просто:
$array = array_reverse ($ array);
$ array = array_reverse ($ array);
Массив_реверс очень быстрый, и он меняет порядок, когда он меняет направление. Кто-то еще показал мне это давным-давно. Поэтому я не могу смириться с этим. Но это очень просто и быстро.
Ответ 13
удаление дубликатов и переиндексация массива:
<?php
$oldArray = array('0'=>'php','1'=>'java','2'=>'','3'=>'asp','4'=>'','5'=>'mysql');
//duplicate removal
$fillteredArray = array_filter($oldArray);
//reindexing actually happens here
$newArray = array_merge($filteredArray);
print_r($newArray);
?>
Ответ 14
Сортировка - это просто sort(), переиндексирование кажется немного глупым, но если это необходимо, это сделает это. Хотя и не на месте. Используйте array_walk(), если вы сделаете это в кучке мест, просто используйте цикл for-key-value, если это одноразовый код, времени.
<?php
function reindex(&$item, $key, &$reindexedarr) {
$reindexedarr[$key+1] = $item;
}
$arr = Array (2 => 'c', 1 => 'b', 0 => 'a');
sort($arr);
$newarr = Array();
array_walk($arr, reindex, &$newarr);
$arr = $newarr;
print_r($arr); // Array ( [1] => a [2] => b [3] => c )
?>
Ответ 15
Подобно вкладу Nick, я пришел к тому же решению для переиндексации массива, но немного увеличил эту функцию с PHP версии 5.4, это не работает из-за передачи переменных по ссылке. Например, функция повторного индексирования используется с помощью use
закрытия ключевого слова:
function indexArrayByElement($array, $element)
{
$arrayReindexed = [];
array_walk(
$array,
function ($item, $key) use (&$arrayReindexed, $element) {
$arrayReindexed[$item[$element]] = $item;
}
);
return $arrayReindexed;
}
Ответ 16
Вот моя собственная реализация. Ключи входного массива будут перенумерованы с добавочными ключами, начиная с $start_index.
function array_reindex($array, $start_index)
{
$array = array_values($array);
$zeros_array = array_fill(0, $start_index, null);
return array_slice(array_merge($zeros_array, $array), $start_index, null, true);
}
Ответ 17
Просто сделайте это:
<?php
array_push($array, '');
$array = array_reverse($array);
array_shift($array);
Ответ 18
Если это сделать, чтобы создать новый массив, это:
$result = array();
foreach ( $array as $key => $val )
$result[ $key+1 ] = $val;
Если вам нужна разворот на месте, вам нужно бежать назад, чтобы вы не топали по индексам, которые вам нужны:
for ( $k = count($array) ; $k-- > 0 ; )
$result[ $k+1 ] = $result[ $k ];
unset( $array[0] ); // remove the "zero" element