【问题标题】:How do you reindex an array in PHP but with indexes starting from 1?如何在 PHP 中重新索引数组但索引从 1 开始?
【发布时间】:2010-10-10 02:49:47
【问题描述】:

我有以下数组,我想重新索引它以便反转键(最好从 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] => 
    )

)

【问题讨论】:

  • 哪里有反转?
  • 查看我对第一个示例的修改
  • 为什么需要第一个元素的索引为 1?只是格式问题还是内部处理?
  • 它将用作函数的参数以获取 url 段,例如 get_url_segment(1) 将返回例如在此页面上的“问题”

标签: php arrays indexing


【解决方案1】:

如果您想从零开始重新索引,只需执行以下操作:

$iZero = array_values($arr);

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

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

这里是所用函数的手册页:

【讨论】:

  • 你应该使用 range(0, count($arr) - 1) 所以你得到一个零索引数组。
  • 很好,或者你可以尝试使用 array_unshift($arr,'') 添加一个零索引元素,然后 unset($arr[0]) 删除它,从而将所有索引向上移动一个。它可能比 array_combine() 更快。或者不是:)
  • 请注意,array_values 返回数组的副本。因此,如果您有对数组的引用,那么array_splice 会更好。请参阅@imagiro 解决方案。
  • 只有 array_values() 才能工作,如果你一直从索引 0 开始。
  • @kishor10d 这不是这个问题要问的!
【解决方案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 的条目将被删除.)

【讨论】:

  • 如果你不关心顺序,你也可以 sort($array);
  • array_filter() 似乎与样本数据完全无关。
  • OP 希望密钥从 1 开始。这是另一个问题的正确答案。
【解决方案3】:

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

array_splice($ar, 0, 0);

这会在原地重新索引,因此您最终不会得到原始数组的副本。

【讨论】:

    【解决方案4】:

    为什么要重新索引?只需将 1 添加到索引:

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

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

    【讨论】:

    • 对这个问题的低估答案:)
    【解决方案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】:

        您可能需要考虑一下为什么要使用从 1 开始的数组。从零开始的数组(使用非关联数组时)非常标准,如果您想输出到 UI,大多数人会通过在输出到 UI 时增加整数来处理解决方案。

        在考虑数组的基于 1 的索引器时,请考虑一致性——无论是在您的应用程序中还是在您使用的代码中。

        【讨论】:

        • 这直接关系到业务层和表现层的分离。如果您正在修改逻辑中的代码以适应演示文稿,那么您正在做坏事。例如,如果您为控制器执行此操作,突然您的控制器会绑定到特定的视图渲染器,而不是为它可能使用的任何视图渲染器(php、json、xml、rss 等)准备数据
        【解决方案8】:

        更优雅的解决方案:

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

        【讨论】:

        • 你称之为优雅?
        【解决方案9】:

        你可以重新索引一个数组,这样新数组就从索引 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
        )
        

        【讨论】:

        • 您不必在此处使用array_values。看我的回答。
        【解决方案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);

            array_reverse 非常快,它会在反转时重新排序。很久以前有人给我看了这个。所以我不能因为提出它而受到赞扬。但它非常简单快捷。

            【讨论】:

              【解决方案13】:

              与 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;
              }
              

              【讨论】:

                【解决方案14】:

                这是我自己的实现。输入数组中的键将使用从 $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);
                }
                

                【讨论】:

                  【解决方案15】:

                  只需这样做:

                  <?php
                  
                  array_push($array, '');
                  $array = array_reverse($array);
                  array_shift($array);
                  

                  【讨论】:

                    【解决方案16】:

                    在 PHP 中一起使用 array_values() 和 array_filter() 函数来删除空数组元素并从数组中重新索引后,您可以轻松地做到这一点。

                    array_filter() function PHP array_filter() 函数从 PHP 中的数组中删除空数组元素或值。这也将删除空白、null、false、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
                    )
                    

                    在上面的输出中,我们想要删除空白、null、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
                    )
                    

                    【讨论】:

                    • array_filter() 似乎与 OP 的样本数据完全无关。
                    【解决方案17】:

                    感觉所有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,
                      ),
                    )
                    

                    【讨论】:

                      【解决方案18】:

                      删除重复并重新索引数组:

                      <?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);
                      ?>
                      

                      【讨论】:

                      • array_filter() 似乎与 OP 的样本数据完全无关。
                      【解决方案19】:

                      我能想到的最快方法

                      array_unshift($arr, null);
                      unset($arr[0]);
                      print_r($arr);
                      

                      如果你只是想重新索引数组(从零开始)并且你有 PHP +7.3,你可以这样做

                      array_unshift($arr);
                      

                      我相信array_unshiftarray_values 更好,因为前者不会创建数组的副本。

                      【讨论】:

                        【解决方案20】:

                        排序只是一个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 )
                        
                        ?>
                        

                        【讨论】:

                          【解决方案21】:

                          如果可以创建一个新数组,那就是:

                          $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
                          

                          【讨论】:

                          • 这个问题的任何答案都不需要循环。答案的关键部分是使用array_values() 获得一个基于 0 的数组,然后如果真的需要一个基于 1 的数组,则对该结果进行一些调整。
                          猜你喜欢
                          • 1970-01-01
                          • 2017-10-14
                          • 2015-05-02
                          • 1970-01-01
                          • 2013-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2023-03-30
                          相关资源
                          最近更新 更多