Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中重新索引数组,但索引从1开始?_Php_Arrays_Indexing - Fatal编程技术网

如何在PHP中重新索引数组,但索引从1开始?

如何在PHP中重新索引数组,但索引从1开始?,php,arrays,indexing,Php,Arrays,Indexing,我有以下数组,我想对其重新编制索引,以便将键反转(理想情况下从1开始): 当前数组(编辑:该数组实际上如下所示): 应该如何: Array ( [1] => Object ( [title] => Section [linked] => 1 ) [2] => Object ( [title] => Sub-Section [linked] => 1 ) [3]

我有以下数组,我想对其重新编制索引,以便将键反转(理想情况下从1开始):

当前数组(编辑:该数组实际上如下所示):

应该如何:

Array (

[1] => Object
    (
        [title] => Section
        [linked] => 1
    )

[2] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[3] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

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

foreach ($array as $key => $val) {
    echo $key + 1, '<br>';
}
foreach($key=>$val的数组){
回显$key+1,“
”; }


问题澄清后编辑:可以使用
数组_值
重置从0开始的索引。如果只希望打印元素从1开始,则可以使用上述算法。

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

$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

这将满足您的要求:

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

?>

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

但是,为了回答您的问题,此函数应该将任何数组转换为基于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 ) );
}
$arr=array('a','b','c');
回声';
打印(重新索引数组($arr));
打印(重新索引数组($arr,1));
打印(重新索引数组($arr,2));
打印(重新索引数组($arr,10));
打印(重新索引数组($arr,-10));
回声';
函数REINDEXRARY($arr,$startAt=0)
{
返回值(0=$startAt)
?数组_值($arr)
:数组_组合(范围($startAt,计数($arr)+($startAt-1)),数组_值($arr));
}

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

$iOne = array_combine(range(1, count($arr)), array_values($arr));
$tmp = array();
foreach (array_values($array) as $key => $value) {
    $tmp[$key+1] = $value;
}
$array = $tmp;
如果需要从1开始,请使用以下命令:

$iOne = array_combine(range(1, count($arr)), array_values($arr));
$tmp = array();
foreach (array_values($array) as $key => $value) {
    $tmp[$key+1] = $value;
}
$array = $tmp;
以下是所用功能的手册页:


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

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

排序只是一个简单的过程,重新编制索引似乎有点傻,但如果需要的话,这就可以了。虽然没有到位。如果要在多个位置执行此操作,请使用。如果这是一次性操作,请使用for key-value循环

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

更优雅的解决方案:

$list=数组_组合(范围(1,计数($list)),数组_值($list));

这里是最好的方法

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
)
你明白了吗

<?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\u values()
:以数字形式返回输入数组和索引的值


array\u filter()
:使用用户定义的函数过滤数组元素(UDF如果没有提供将删除输入表中所有值为FALSE的项)。删除重复项并重新索引数组:

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

与@monowerker类似,我需要使用对象的键重新索引数组

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
        )
)
这导致:

array_splice($ar, 0, 0);

我刚发现你也可以做一个

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

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

您可以重新编制数组的索引,使新数组以1开始,如下所示

Array
(
    [2] => red
    [1] => green
    [0] => blue
)
Array
(
    [1] => red
    [2] => green
    [3] => blue
)
上述输出为:

function indexArrayByElement($array, $element)
{
    $arrayReindexed = [];
    array_walk(
        $array,
        function ($item, $key) use (&$arrayReindexed, $element) {
            $arrayReindexed[$item[$element]] = $item;
        }
    );
    return $arrayReindexed;
}

如果不尝试对阵列重新排序,可以执行以下操作:

$array=array\u reverse($array)
$array=array\u reverse($array)


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

与Nick的贡献类似,我使用了相同的解决方案来重新索引数组,但对函数进行了一点增强,因为从PHP 5.4版开始,它不起作用,因为通过引用传递变量。然后,使用
use
关键字闭包重新索引函数的示例如下:

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

这是我自己的实现。输入数组中的键将重新编号,并从$start_index开始递增

<?php

array_push($array, '');
$array = array_reverse($array);
array_shift($array);
只需这样做:

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r($stack);
?>

在PHP中,将array_values()和array_filter()函数一起使用以删除空数组元素并从数组中重新索引之后,您可以轻松地执行此操作

函数的作用是:从PHP中的数组中删除空数组元素或值。这也将删除空白、null、false、0(零)值

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

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

首先,让我们看看$stack数组输出:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => 
    [4] => JavaScript
    [5] => 
    [6] => 0
)
在上面的输出中,我们希望删除空白、null、0(零)值,然后重新索引数组元素。现在我们将一起使用array_values()和array_filter()函数,如下例所示:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => JavaScript
)

感觉所有的
array\u combine()

array\u combine()
忽略它接收的两个参数的键

代码:()

输出:

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

我能想到的最快的方法

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


我相信
array\u unshift
array\u values
更好,因为前者不会创建数组的副本。

哪里有相反的东西?请参见我对第一个示例的编辑,为什么需要第一个元素的索引为1?只是格式问题还是内部处理?将用作段落
Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => JavaScript
)
$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,
  ),
)
array_unshift($arr, null);
unset($arr[0]);
print_r($arr);
array_unshift($arr);