Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.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 取消设置元素后重新设置数组键的基址_Php - Fatal编程技术网

Php 取消设置元素后重新设置数组键的基址

Php 取消设置元素后重新设置数组键的基址,php,Php,我有一个数组: $array = array(1,2,3,4,5); 如果要转储数组的内容,它们将如下所示: array(5) { [0] => int(1) [1] => int(2) [2] => int(3) [3] => int(4) [4] => int(5) } 当我循环并取消设置某些键时,索引会被提升 foreach($array as $i => $info) { if($info == 1 || $info ==

我有一个数组:

$array = array(1,2,3,4,5);
如果要转储数组的内容,它们将如下所示:

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}
当我循环并取消设置某些键时,索引会被提升

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}
随后,如果我现在进行另一次转储,它将如下所示:

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}
是否有适当的方法重置数组,使其元素再次以零为基础

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}
试试这个:

$array = array_values($array);

使用使用
阵列拼接
而不是
取消设置

$array = array(1,2,3,4,5);
foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    array_splice($array, $i, 1);
  }
}

print_r($array);

或者您可以创建自己的函数,通过引用传递数组

function array_unset($unsets, &$array) {
  foreach ($array as $key => $value) {
    foreach ($unsets as $unset) {
      if ($value == $unset) {
        unset($array[$key]);
        break;
      }
    }
  }
  $array = array_values($array);
}
那么你要做的就是

$unsets = array(1,2);
array_unset($unsets, $array);
。。。现在,您的
$array
没有您在
$unsets
中放置的值,并且键被重置

只是一个加法。 我知道这是一个很老的问题,但我想添加一个解决方案,但我不知道我是怎么想出来的。在寻找另一个解决方案时发现了这个问题,然后想,“好吧,趁我在这里。”

首先,在您运行循环之后,您可以使用的答案很好,但是,我更愿意一次完成所有工作。当然,在我的具体案例中,我需要做的工作比这里这个简单的例子要多,但是这个方法仍然适用。我看到了一些其他人建议的
foreach
循环,但是,由于野兽的本性,这仍然会给你留下下班后的时间。通常我建议使用更简单的方法,比如
foreach
,但是,在这种情况下,最好记住老式的
for循环逻辑。只需使用
i
!要保持适当的索引,只需在每次删除数组项后从
i
中减去

下面是我简单的工作示例:

$array = array(1,2,3,4,5);

for ($i = 0; $i < count($array); $i++) {
    if($array[$i] == 1 || $array[$i] == 2) {
        array_splice($array, $i, 1);
        $i--;
    }
}

这可以有许多简单的实现。例如,我的确切案例要求根据多维值保存数组中的最新项。我会告诉你我的意思:

$files = array(
    array(
        'name' => 'example.zip',
        'size' => '100000000',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '10726556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '110726556',
        'type' => 'application/x-zip-compressed',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example2.zip',
        'size' => '12356556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip',
        'deleteUrl' => 'server/php/?file=example2.zip',
        'deleteType' => 'DELETE'
    )
);

for ($i = 0; $i < count($files); $i++) {
    if ($i > 0) {
        if (is_array($files[$i-1])) {
            if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) {
                if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url'];
                $i--;
                array_splice($files, $i, 1);
            }
        }
    }
}

如您所见,我在拼接之前操纵$I,因为我试图删除上一项,而不是当前项。

有另一个有趣的方法:

$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); 

$array = array_merge($array); 

现在$array键被重置。

回答晚了,但在PHP5.3之后可能会这样

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);

在我的情况下,我需要用数组值保留唯一的键,所以我只使用了第二个数组:

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);

我使用
$arr=array\u merge($arr)
以重新设置数组的基址。简单明了。

100%为我工作!在取消设置数组中的元素后,可以使用此选项重新索引数组

$result=array_combine(range(1, count($your_array)), array_values($your_array));

+1.我注意到手册没有明确说明将维持订购,但我不明白为什么不维持订购。是的,订购肯定会维持。如果它重新排序,那将是一个可怕的函数!:)@对不起,但那不是真的。它实际上会对我的数组重新排序。非常非常奇怪。始终使用简单简洁的解决方案:)虽然当数组已经编号时,这是一个简单的解决方案,但当键设置为文本时,它不起作用,就像它将作为HTML表单的一部分一样。如果您依赖唯一键值来标识表单的输出,则以下方法之一效果更好。这不起作用。splice非常棒,但不能在for/foreach循环中使用它,因为每次调用它时它都会重新排列索引,因此foreach循环的索引不会指向下一个元素,而是指向在重新排列的数组中具有该位置的元素。在您的示例中可以看到,您正在删除值“3”并保留值“2”,而此时您应该只删除值“1”和“2”@elcodedocle,然后不要使用
foreach
循环。使用标准的
i环路
,只需在拼接后重置i即可。另外,它不工作。断开的链接,你能修复它吗?1)你
unset($arr1)
,这将使它无法在你的循环中迭代。2) 您缺少倒数第二行的分号。此代码段将不会运行。使用
splice
的完美解决方案可用于真正的大型阵列,因为不需要拷贝。所以我没有内存问题。
$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);
$result=array_combine(range(1, count($your_array)), array_values($your_array));