Dram

Рейтинг
1115
Регистрация
28.06.2008
Главное что смущает - вот ловлю я ошибку, смотрю страницу на которой ее поймал, но там дата в нужном формате, запускаю парсер заново и он без ошибок проходит эту же страницу, где только что вывалился с ошибкой. Вот этот момент мне и не понятен. То есть ошибка, то нет... Такое впечатление что как бы не успевает распарситься перед вызовом функции, но это же бред...
Спасибо за помощь, понял куда копать, буду ловить!

Прошу оценить мое собственное решение, мне кажется оно в разы лаконичнее и понятнее


$tmp = 0;
$newArr = [];
for($i=0;$i<317;$i++){
    if(!in_array(1, $tempArr[$i])) {
        //добавляем первый подмассив, или если после цепочки единиц начались нули $tmp еще не перезатерлась и скажет нам об этом
        if(count($newArr)==0 || $tmp == 1){
            array_push($newArr, $tempArr[$i]);
        }else{
            foreach ($tempArr[$i] as $item) {
                array_push($newArr[count($newArr)-1], $item);
            }
        }
        $tmp = 0;

    }  else {
         //пушим новый подмассив с единицами, если он пошел после цепочки нулей $tmp еще не перезатерлась и скажет нам об этом
        if($tmp == 0){
            array_push($newArr, $tempArr[$i]);
        }
        if($tmp == 1){
            foreach ($tempArr[$i] as $item) {
                array_push($newArr[count($newArr)-1], $item);
            }
        }
        $tmp = 1;
    }
}
Установил плагин (уже забыл как он называется) и он остановил спам.

Спасибо то что нужно!

Мне трудно понять вашу логику и массив у вас получается трехмерный.

Я пока остановился на такой логике

$tmp = 0;
$newArr = [];

for($i=0;$i<317;$i++){
    if(!in_array(1, $tempArr[$i])) {
        //добавляем первый подмассив, или если после цепочки единиц начались нули $tmp еще не перезатерлась и скажет нам об этом
        if(count($newArr)==0 || $tmp == 1){
            array_push($newArr, $tempArr[$i]);
        }
         if($tmp == 0 && count($newArr)!==1 ) {
            $newArr = array_merge($newArr[count($newArr)-1], $tempArr[$i]);
        }
        $tmp = 0;
    }  else {
        if($tmp == 0){
//пушим новый подмассив с единицами, если он пошел после цепочки нулей $tmp еще не перезатерлась и скажет нам об этом
            array_push($newArr, $tempArr[$i]);
        }
        if($tmp == 1){
            $newArr = array_merge($newArr[count($newArr)-1], $tempArr[$i]);
        }
        $tmp = 1;
    }
}

Первую итерацию отрабатывает, потом сыпятся ошибки, пытаюсь понять что не так. Ругается что у меня там не массивы, но они ж массивы мля


Warning: array_push() expects parameter 1 to be array, null given in C:\OSPanel\domains\localhost\index.php on line 138

Warning: count(): Parameter must be an array or an object that implements Countable in C:\OSPanel\domains\localhost\index.php on line 144

Warning: array_merge(): Expected parameter 1 to be an array, null given in C:\OSPanel\domains\localhost\index.php on line 144

Мне не нужно два подмассива, мне нужны меньшие блоки, см. выше, расписал подробнее.

Исходный массив двухуровневый, нет подмассивов 3-ого уровня.

$oldArray похож - в каждом подмассиве 50 значений (либо одни нули, либо 1 и 0).

Ваш код в итоге собрал мне два огромных подмассива, в первом только нули во втором нули + единицы.

В $oldArray подряд идут только подмассивы нулей, а когда начинаются подмассивы с единицами, то они тоже идут несколько раз подряд, потом опять начинаются только нули.

Вот мне и нужно как бы разрезать старый массив на блоки (подмассивы) где 1+0

Было

$oldArray = [ 0=>{0,0,0 ...одни нули}, 1=>{0,0,0 ...одни нули}, 2=>{0,0,0 ...одни нули}, 3=>{0,0,0 ...одни нули}, 4=>{0,0,1 ...есть единица}, 5=>{0,1,0 ...есть единица}, 6=>{1,0,0 ...есть единица}, 7=>{0,0,0 ...одни нули}, 8=>{0,0,0 ...одни нули},
9=>{0,0,1 ...есть единица}, 10=>{0,1,0 ...есть единица}, 11=>{1,1,0 ...есть единица}, ] стало $newArray = [ 0=>{0,0,0 ...одни нули (склеиваем подмассивы с 0 по 3)}, 1=>{1,0,1 ...есть единица (склеили подмассивы с 4 по 6}, 2=>{0,0,0 ...одни нули (склеиваем подмассивы с 7 по 8)},
3=>{0,1,1 ...есть единица (склеили подмассивы с 9 по 11}, ]
timo-71 #:

Надо в санаторий😅

Спасибо, но видать реально надо ))) Финальный то вариант какой (весь код)?

В последнем блоке у вас не опреден массив $new_a, а я за вашей логикой что-то не поспеваю...

timo-71 #:

А ну да, ну да. Был невнимателен. Прошу понять и простить

Спасибо за помощь - все равно не то.

Вот начало полученного массива, он трехуровневый

array(2) {
  [0]=>
  array(81) {
    [2]=>
    array(51) {
      [0]=>
      int(2)
      [1]=>
      int(0)
      [2]=>
      int(0)
      [3]=>
      int(0)
.....
и его конец
....








} [312]=> array(51) { [0]=> int(312) [1]=> int(0) [2]=> int(0)

Каждый подмассив 3-го уровня длинной 50 (как и у исходного). + непонятно растущий первый элемент каждого подмассива (зачеркнул), он увеличивается 

А нужен массив 2-х уровневый который по идее (в результате склейки) будет иметь подмассивы разной длинны.


Может ошибся где?

$tmp = 0;
$new_a = [];

for($i=0;$i<317;$i++){
    if(!in_array(1, $tempArr[$i])) {
        if($tmp[0]===0) { #значит предыдущий - только нули
            $new_a[0][$tmp[1]] = $tempArr[$tmp[1]]; #чтобы учесть предыдущий, если он учтен, то будет просто переписан
            $new_a[0][$i] = $tempArr[$i];
        }
        $tmp = [0, $i]; #первый элемент 0 если только нули, второй ссылка на индекс элемента
        #если нужен
        #$new_a[3][$i] = $oldArray[$i];
    }  else {
        if($tmp[0]===1)  {
            $new_a[1][$tmp[1]] = $tempArr[$tmp[1]];
            $new_a[1][$i] = $tempArr[$i];
        }
        $tmp = [1, $i];
    }
}

вот это не понял

if($tmp[0]===0)

какой индекс - это же переменная, не массив?

Всего: 6928