Как удалить из массива 4 элемента, если они пустые?

Kood-Good

Новичок
kost
:) ну не случайно же они там подряд. твое время мне совсем не нужно

-~{}~ 14.03.06 00:21:

ну да, кстати в случае для 4 элементов должно быть $i=$i+3
 

bgm

 
Совершенно не вижу причины, по коей благородному дону возбранялось бы удалять четыре подряд идущих пустых элементов массива...
 

MustDie

Новичок
for ($i=0;$i<sizeof($a);$i++){
if (($a[$i]=='')&&($a[$i+1]=='')&&($a[$i+2]=='')&&($a[$i+3]=='')){ unset ($a[$i] , $a[$i+1] , $a[$i+2] , $a[$i+3]);
;}
$i<sizeof($a)
думаю лучше вытащить ее из FOR
а ту всякие случаи могут быть...
PHP:
$co = sizeof($a);
for ($i=0; $i<$co; $i++):
	if ($a[$i]=='') && ($a[$i+1]=='') && ($a[$i+2]=='') && ($a[$i+3]=='')
		unset ($a[$i] , $a[$i+1] , $a[$i+2] , $a[$i+3]); 
endfor;
 

MustDie

Новичок
запусти у себя такой код
PHP:
<pre>
<?php
$a = array(3123, "", "", "", "", 2313, 12324, 124, "", "", "ffe", "", "", 2, "", "", "", "");
print_r($a);
echo "\n\n\n";
for ($i=0;$i<sizeof($a);$i += 3):
	if (($a[$i]=='')&&($a[$i+1]=='')&&($a[$i+2]=='')&&($a[$i+3]==''))
		unset ($a[$i] , $a[$i+1] , $a[$i+2] , $a[$i+3]); 
endfor;
print_r($a);
?>
а потом переделай цикл так:
PHP:
$co = sizeof($a);
for ($i=0;$i<$co;$i += 3):
	if (($a[$i]=='')&&($a[$i+1]=='')&&($a[$i+2]=='')&&($a[$i+3]==''))
		unset ($a[$i] , $a[$i+1] , $a[$i+2] , $a[$i+3]); 
endfor;
в первом случаем он тебе последние 4 пустых строчек не удалит...
а во втором - все будет нормально...
=====
в первом случае $i<sizeof($a)
при каждом новом витке - подчитывается заного!
а тут у нас идет удаление элементов массива...
и таким образом $i не когда недойдет до конца, если только не удалится не один элемент!!!
 

Kood-Good

Новичок
народ! здесь когда-нибудь закрываются темы? эту давно пора закрыть.
MustDie, если тебе так это важно: я упростил задачу когда писал ее в форум. после каждых 4-х элемнтов стоит 5-ый элемент "next", который означает переход к следующим 4-ем. ты понял логику? ты понял что я хотел узнать? я надеюсь. тема закрыта
 

Фанат

oncle terrible
Команда форума
Kood-Good
в следующий раз с "упрощёнными" задачами будь добр ходить в какое-нибудь другое место
 

Sluggard

Новичок
Мне не надо запускать эти скрипты, чтобы увидеть в ОБОИХ наличие ошибок.
Kood-Good
Что же ты раньше не сказал, что не хочешь научиться писать хорошие программы?
 

Sluggard

Новичок
а зачем тогда пишишь, что не надо вытаскивать из for?
"Не надо"? Неее, я не говорил... Это не я вообще был! ;)
Синтаксис for'а позволяет инициализировать не только итераторы.
$i += 3; - частично позволяет избежать обращения к несуществующим элементам. Но вставил ты этот код не туда. А у меня там, между прочим, точка с запятой стаяла, которую ты выкинул самовольно. ;)
$co = sizeof($a); - допускает обращение к несуществующим элементам массива.
 

Sluggard

Новичок
А из for'а можно было и не вытаскивать.
Где ты видишь "НЕ НАДО"? МОЖНО не вытаскивать и это так.
По поводу:
$co = sizeof($a); - допускает обращение к несуществующим элементам массива.
уверен, сам сможешь найти ошибку.
 

MustDie

Новичок
Где ты видишь "НЕ НАДО"? МОЖНО не вытаскивать и это так.
В этом случае ДАЖЕ нужно вытаскивыать, короче..
запусти тот КОД который выше..
и сам все поймешь...

тут пошел уже ОФФТОП
 

MustDie

Новичок
ты перед тем как писать - думай что писать... и проверяй
опыта тебе не хватает, я с такой проблемой очень часто встречаюсь...
 

Sluggard

Новичок
я с такой проблемой очень часто встречаюсь...
Так пора бы научиться решать уже :)
Ок, пиши свой рабочий код, укажу на недостатки (если будут). Те два, что ты привел вверху, ОБА работают некорректно.
 

Sluggard

Новичок
УЧИТСЯ УЧИТСЯ УЧИТСЯ
Кто учится? Я его/ее знаю?

Что-то беседа стала напрягать... Ок. Вот твой последний код, который якобы работает правильно:

PHP:
$co = sizeof($a);
for ($i=0;$i<$co;$i += 3):
    if (($a[$i]=='')&&($a[$i+1]=='')&&($a[$i+2]=='')&&($a[$i+3]==''))
        unset ($a[$i] , $a[$i+1] , $a[$i+2] , $a[$i+3]);
endfor;
Здесь ошибка в:
PHP:
for ($i=0;$i<$co;$i += 3)
А точнее $i += 3. Думаю, ты описался. Это очевидно. Указал к слову:
ОБА работают некорректно.
К примеру у тебя первые 4 элемента пустые (с 0-го по 3-й). При первой итерации ($i = 0) ты удаляешь 0-й, 1-й, 2-й и 3-й элементы. В следующих итерациях ты будешь проверять 1-й, 2-й, 3-й... элементы. Но их нет!!! Мы их удалили!!! Чтобы не проверять элементы, которых нет, мы дополняем код:
PHP:
    if (($a[$i]=='')&&($a[$i+1]=='')&&($a[$i+2]=='')&&($a[$i+3]=='')) {
        unset ($a[$i] , $a[$i+1] , $a[$i+2] , $a[$i+3]);
        $i += 3;
    }
Вот куда следовало вставить $i += 3;

Теперь представим, у нас 6 элементов (с 0-го по 5-й).
Следовательно наш итератор возможно будет принимать все значения от 0 до 5. Значит, при $i = 3, 4, 5 скрипт будет проверять несуществующие элементы. Для того, чтобы этого не случилось, исправляем:
PHP:
$co = sizeof($a) - 3;
А теперь внимание! Ответ на:
из for'а можно было и не вытаскивать
PHP:
for ($i = 0, $co = sizeof($a) - 3; $i < $co; $i++)
Итого имеем:
PHP:
$a = array(3123, "", "", "", "", 2313, 12324, 124, "", "", "ffe", "", "", 2, "", "", "", "");
print_r($a);
for ($i = 0, $co = sizeof($a) - 3; $i < $co; $i++) {
  if (($a[$i] == '') && ($a[$i + 1] == '') && ($a[$i + 2] == '') && ($a[$i + 3] == '')) {
    unset ($a[$i] , $a[$i + 1] , $a[$i + 2] , $a[$i + 3]);
    $i += 3;
  }
}
print_r($a);
 

SelenIT

IT-лунатик :)
после каждых 4-х элемнтов стоит 5-ый элемент "next", который означает переход к следующим 4-ем. ты понял логику?
...почему бы просто не сделать массив двумерным?
 
Сверху