Ответ 1
Попробуйте следующее:
$array = array_values($array);
Использование array_values ()
У меня есть массив:
$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)
}
Есть ли правильный способ для reset массива, чтобы его элементы снова были основаны на нуле?
array(3) {
[0] => int(3)
[1] => int(4)
[2] => int(5)
}
Попробуйте следующее:
$array = array_values($array);
Использование array_values ()
Получил еще один интересный метод:
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
$array = array_merge($array);
Теперь ключи $массива reset.
Используйте array_splice
, а не unset
:
$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);
Я знаю, что это старый, но я хотел добавить решение, которое не вижу, что я придумал сам. Нашел этот вопрос во время охоты на другое решение и просто подумал: "Ну, пока я здесь".
Прежде всего, ответ Neal хорош и полезен после запуска вашего цикла, однако я бы предпочел, чтобы все работали сразу. Конечно, в моем конкретном случае мне пришлось сделать больше работы, чем этот простой пример, но метод все же применяется. Я видел, что пара других предложила петли foreach
, однако это все еще оставляет вас после работы из-за природы зверя. Обычно я предлагаю более простые вещи, такие как foreach
, однако в этом случае лучше всего вспомнить старую старую логику for loop
. Просто используйте i
! Чтобы поддерживать соответствующий индекс, просто вычтите из i
после каждого удаления элемента Array.
Вот мой простой, рабочий пример:
$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--;
}
}
Будет выводиться:
array(3) {
[0]=> int(3)
[1]=> int(4)
[2]=> int(5)
}
Это может иметь много простых реализаций. Например, мой точный случай требовал хранения последнего элемента в массиве на основе многомерных значений. Я покажу вам, что я имею в виду:
$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);
}
}
}
}
Будет выводиться:
array(1) {
[0]=> array(6) {
["name"]=> string(11) "example.zip"
["size"]=> string(9) "110726556"
["type"]=> string(28) "application/x-zip-compressed"
["deleteUrl"]=> string(28) "server/php/?file=example.zip"
["deleteType"]=> string(6) "DELETE"
["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip"
}
[1]=> array(6) {
["name"]=> string(11) "example2.zip"
["size"]=> string(9) "12356556"
["type"]=> string(28) "application/x-zip-compressed"
["deleteUrl"]=> string(28) "server/php/?file=example2.zip"
["deleteType"]=> string(6) "DELETE"
["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip"
}
}
Как вы видите, я манипулирую $i перед сращиванием, поскольку я пытаюсь удалить предыдущий, а не текущий элемент.
Или вы можете создать свою собственную функцию, которая передает массив по ссылке.
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
, и клавиши reset
Поздний ответ, но после PHP 5.3 может быть так:
$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
return !($v == 1 || $v == 2);
}));
print_r($array);
100% работает на меня! После сброса элементов в массиве вы можете использовать его для повторной индексации массива
$result=array_combine(range(1, count($your_array)), array_values($your_array));
Я использую $arr = array_merge($arr);
, чтобы перебазировать массив. Просто и понятно.
В моей ситуации мне нужно было сохранить уникальные ключи со значениями массива, поэтому я просто использовал второй массив:
$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);
$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);