代码之家  ›  专栏  ›  技术社区  ›  meleyal

如何在PHP中重新建立数组的索引?

  •  127
  • meleyal  · 技术社区  · 16 年前

    我有以下数组,我想重新索引它,以便反转键(理想情况下从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] => 
        )
    
    )
    
    19 回复  |  直到 6 年前
        1
  •  373
  •   Andrew Moore    16 年前

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

    $iZero = array_values($arr);
    

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

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

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

        2
  •  50
  •   Bram Vanroy    9 年前

    这是最好的方法 :

    # 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
  •  8
  •   Gumbo    16 年前

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

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

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

        4
  •  8
  •   imagiro    11 年前

    我刚发现你也可以做一个

    array_splice($ar, 0, 0);
    

    这样做是就地重新索引,所以最终不会得到原始数组的副本。

        5
  •  6
  •   Peter Bailey    16 年前

    好吧,我想知道不管你的最终目标是什么,实际上你不需要将数组修改为1-based,而不是0-based,但是可以在迭代时处理它,就像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
  •  5
  •   Greg    16 年前

    这将满足您的需求:

    <?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
  •  5
  •   IonuÅ£ Pleşca    14 年前

    更优雅的解决方案:

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

        8
  •  5
  •   Nigel Alderton    11 年前

    您可以重新索引一个数组,使新数组以这样的索引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
  •  4
  •       16 年前

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

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

        10
  •  4
  •   Nick    11 年前

    与@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
  •  3
  •   Tom Haigh    16 年前
    $tmp = array();
    foreach (array_values($array) as $key => $value) {
        $tmp[$key+1] = $value;
    }
    $array = $tmp;
    
        12
  •  3
  •   Mark    10 年前

    如果不想对数组重新排序,只需执行以下操作:

    $array=array_reverse($array);
    $array=array_reverse($array);

    数组的反转速度非常快,当它反转时会重新排序。很久以前有人给我看了这个。所以我不能相信自己能做到这一点。但它非常简单和快速。

        13
  •  2
  •   sravs    9 年前

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

    <?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
  •  1
  •   monowerker    16 年前

    排序只是一个 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
  •  1
  •   VLS    8 年前

    与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
  •  1
  •   mhadidg    7 年前

    这是我自己的实现。输入数组中的键将用从$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
  •  0
  •   Roham Tehrani M. S.M    6 年前

    简单地做到这一点:

    <?php
    
    array_push($array, '');
    $array = array_reverse($array);
    array_shift($array);
    
        18
  •  0
  •   Star Daniel Samson    6 年前

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

    array_filter() function 函数的作用是:从php数组中删除空数组元素或值。这还将删除空、空、假、0(零)值。

    array_values() function 函数的作用是:返回一个包含数组所有值的数组。返回的数组将具有数字键,从0开始并增加1。

    移除空数组元素并重新索引

    首先让_s查看$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
  •  -9
  •   Jason Cohen    16 年前

    如果可以创建一个新的数组,则如下所示:

    $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
    
    推荐文章