当前位置:  开发笔记 > 编程语言 > 正文

你如何在PHP中重新索引数组?

如何解决《你如何在PHP中重新索引数组?》经验,为你挑选了9个好方法。

我有以下数组,我想重新索引,所以键是相反的(理想情况下从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] => 
    )

)

Andrew Moore.. 403

如果要将索引重新开始归零,只需执行以下操作:

$iZero = array_values($arr);

如果您需要从一开始,请使用以下内容:

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

以下是所用功能的手册页:

array_values()

array_combine()

range()


小智.. 54

这是最好的方法:

# 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的所有条目.)



1> Andrew Moore..:

如果要将索引重新开始归零,只需执行以下操作:

$iZero = array_values($arr);

如果您需要从一开始,请使用以下内容:

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

以下是所用功能的手册页:

array_values()

array_combine()

range()



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的所有条目.)


如果你不关心订单,你也可以只排序($ array);

3> imagiro..:

我刚刚发现你也可以做一个

array_splice($ar, 0, 0);

这会重新建立索引,因此您不会得到原始数组的副本.



4> Gumbo..:

为什么重新索引?只需在索引中添加1:

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

编辑    问题澄清之后:您可以使用array_values从0开始重置索引.如果您只是希望打印元素从1开始,则可以使用上面的算法.



5> Peter Bailey..:

好吧,我想,无论你的最终目标是什么,你实际上都不需要将数组修改为基于1而不是基于0,但是可以像Gumbo发布的那样在迭代时间处理它.

但是,要回答您的问题,此函数应将任何数组转换为基于1的版本

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

编辑

如果您需要,这是一个更可重用/灵活的功能

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

echo '
';
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 '
'; function reIndexArray( $arr, $startAt=0 ) { return ( 0 == $startAt ) ? array_values( $arr ) : array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) ); }



6> Greg..:

这将做你想要的:

 '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> Michael Trau..:

您可能要考虑为什么完全要使用基于1的数组。从零开始的数组(使用非关联数组时)是非常标准的,如果要输出到UI,大多数将通过在输出到UI时增加整数来处理该解决方案。

在考虑基于1的数组索引器时,请考虑应用程序和使用的代码中的一致性。


这与业务层和表示层之间的分离直接相关。如果您正在修改逻辑中的代码以适应演示,那么您所做的事情就很糟糕。例如,如果您对控制器执行此操作,则突然将您的控制器绑定到特定的视图渲染器,而不是为其可能使用的任何视图渲染器准备数据(php,json,xml,rss等)。

8> Ionuţ Pleşca..:

更优雅的解决方案:

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


你称之为优雅吗?

9> Nigel Aldert..:

您可以重新索引数组,以便新数组以索引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
)

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有