我有以下数组,我想重新索引,所以键被反转(理想情况下从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] =>
)
)
答案 0 :(得分:385)
如果要将索引重新开始归零,只需执行以下操作:
$iZero = array_values($arr);
如果您需要从1开始,请使用以下内容:
$iOne = array_combine(range(1, count($arr)), array_values($arr));
以下是所用功能的手册页:
答案 1 :(得分:53)
这是最好的方法:
# 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的所有条目< / strong>即可。)
答案 2 :(得分:8)
为什么要重新编制索引?只需在索引中添加1:
foreach ($array as $key => $val) {
echo $key + 1, '<br>';
}
编辑在澄清问题之后:您可以使用array_values
重置从0开始的索引。如果您只是想要打印元素,则可以使用上面的算法在1。
答案 3 :(得分:8)
我刚发现你也可以做一个
array_splice($ar, 0, 0);
这就是重新建立索引,所以你最终得不到原始数组的副本。
答案 4 :(得分:6)
好吧,我想,无论你的最终目标是什么,你实际上都不需要将数组修改为基于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 ) );
}
答案 5 :(得分:5)
这将做你想要的:
<?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 )
?>
答案 6 :(得分:5)
更优雅的解决方案:
$list = array_combine(range(1, count($list)), array_values($list));
答案 7 :(得分: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
)
答案 8 :(得分:4)
您可能想要考虑为什么要使用基于1的数组。基于零的数组(使用非关联数组时)非常标准,如果您想要输出到UI,大多数人只需在输出到UI时增加整数即可处理解决方案。
在考虑基于1的数组索引器时,考虑应用程序和使用的代码中的一致性。
答案 9 :(得分:4)
与@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
)
)
答案 10 :(得分:3)
$tmp = array();
foreach (array_values($array) as $key => $value) {
$tmp[$key+1] = $value;
}
$array = $tmp;
答案 11 :(得分:3)
如果你不想重新排序数组,你可以这样做:
$ array = array_reverse($ array);
$ array = array_reverse($ array);
array_reverse非常快,并且在它反转时重新排序。很久以前有人给我看过这个。因此,我不能因为提出它而获得赞誉。但它非常简单快速。
答案 12 :(得分:2)
重复删除并重新索引数组:
<?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);
?>
答案 13 :(得分:1)
我能想到的最快方法
array_unshift($arr, null);
unset($arr[0]);
print_r($arr);
如果您只想为数组重新索引(从零开始)并且拥有PHP +7.3,则可以使用这种方式
array_unshift($arr);
我相信array_unshift
比array_values
更好,因为前者不会创建数组的副本。
答案 14 :(得分:1)
只需执行以下操作:
<?php
array_push($array, '');
$array = array_reverse($array);
array_shift($array);
答案 15 :(得分:1)
这是我自己的实现。输入数组中的键将使用从$ 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);
}
答案 16 :(得分:1)
与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;
}
答案 17 :(得分:1)
排序只是一个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 )
?>
答案 18 :(得分:0)
在结合使用array_values()和array_filter()函数以从PHP中的数组中删除空数组元素并重新索引后,您可以轻松地做到这一点。
array_filter() function PHP array_filter()函数从PHP中的数组中删除空数组元素或值。这还将删除空白,空,假,0(零)值。
array_values() function PHP array_values()函数返回一个包含数组所有值的数组。返回的数组将具有数字键,从0开始并以1递增。
删除空数组元素并重新索引
首先让我们看一下$ stack数组的输出:
<?php
$stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
print_r($stack);
?>
输出:
Array
(
[0] => PHP
[1] => HTML
[2] => CSS
[3] =>
[4] => JavaScript
[5] =>
[6] => 0
)
在上面的输出中,我们要删除空白,空,0(零)值,然后重新索引数组元素。现在,我们将一起使用array_values()和array_filter()函数,如下例所示:
<?php
$stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
print_r(array_values(array_filter($stack)));
?>
输出:
Array
(
[0] => PHP
[1] => HTML
[2] => CSS
[3] => JavaScript
)
答案 19 :(得分:0)
感觉所有的array_combine()
答案都在复制相同的“错误”(array_values()
的不必要呼叫)。
array_combine()
会忽略它收到的两个参数的键。
代码:(Demo)
$array = [
2 => (object)['title' => 'Section', 'linked' => 1],
1 => (object)['title' => 'Sub-Section', 'linked' => 1],
0 => (object)['title' => 'Sub-Sub-Section', 'linked' => null]
];
var_export(array_combine(range(1, count($array)), $array));
输出:
array (
1 =>
(object) array(
'title' => 'Section',
'linked' => 1,
),
2 =>
(object) array(
'title' => 'Sub-Section',
'linked' => 1,
),
3 =>
(object) array(
'title' => 'Sub-Sub-Section',
'linked' => NULL,
),
)
答案 20 :(得分:-9)
如果可以创建一个新数组,那就是:
$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