Dram

Рейтинг
1114
Регистрация
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]);
        }
         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)

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

Спасибо, переписал так

$tmp = 0;
$prevtmp=2;
$newArr = [];

for
($i=0;$i<317;$i++){

    if (in_array(1,$tempArr[$i]) )
    {
        $tmp=1;
    }
    else {
        $tmp=0 ;
    }
    if ($tmp!=$prevtmp) {
        $newArr = $tempArr[$i];
        $prevtmp = $tmp;
    }
    else {
        array_merge ($tempArr[$i],$newArr[count($newArr)-1]);
    }

}

В итоге получил массив и 317 подмассивов. Или я ошибся или логика неверная.

А где вообще лежат файлы форума?

Как тогда понять эти данные из доков (пусть и к 5 версии),  https://laravel.ru/docs/v5/blade#отображение-5

Вместо написания тернарного оператора Blade позволяет вам использовать такое удобное сокращение, которое будет скомпилировано в тернарный оператор, приведённый ранее:

{{ $name or 'Default' }}

Если переменная $name  имеет значение, то оно будет отображено, иначе будет выведено слово Default .

Я не пойму, почему <p>{{ $city or 'Москва' }}</p> выводит 1 ?
Если убрать or 'Москва' то выводит как и ожидалось значение сити.
Всего: 6924