Логика заполнения двумерного массива PHP

123
D
На сайте с 28.06.2008
Offline
1113
#11
timo-71 #:

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

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

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

T7
На сайте с 19.09.2018
Offline
63
#12

Dram #:
(весь код)?

Кстати, да. Может опять неверно понял задание😆  Обратите внимание на $oldArray - исходный похож на него?
<?php

$oldArray = [
  [0,0,0],
  [0,0,0],
  [0,1,0],
  [0,0,0],
  [0,0,0],
  [0,0,0],
  [0,1,0],
  [0,1,0],
  [0,0,0],
  [1,1,1],
];

$new_a = [
  0=>[],
  1=>[]
];

$l = count($oldArray);
$tmp0 = [];
$tmp1 = [];

function _a(array &$a, array &$b, array $c){
  foreach($c as $v){
    $a = array_merge($a, $b[$v]);
  }
}

for($i=0;$i<$l;$i++){
  if(!in_array(1, $oldArray[$i])) {    
    if(count($tmp1)>1)  {
      _a($new_a[1], $oldArray, $tmp1);
    }
    array_push($tmp0, $i);
    $tmp1 = [];
  }  else {    
    if(count($tmp0)>1) {
      _a($new_a[0], $oldArray, $tmp0);
    }
    array_push($tmp1, $i);
    $tmp0 = [];
  }
}

var_dump($new_a);

exit();
Dram #:
что-то не поспеваю...

Тут просто все, если нет 1, то в 

$tmp0

собираем индексы исходного массива. Как только есть 1,  обнуляем $tmp0, предварительно посчитав кол -во собранных индексов. Если их больше одного, значит  подряд => сливаем в результирующий $new_a[0]. Аналогично поступаем там где есть, сливаем в    $new_a[1]

D
На сайте с 28.06.2008
Offline
1113
#13

$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}, ]
T7
На сайте с 19.09.2018
Offline
63
#14

, если подряд идут только с нулями, то склеиваем их  один

Их мы тоже начинаем склеивать вместе. И т.д.

Dram #:
мне два огромных подмассива

317 * 50 = 15850.

В двух, в сумме должно быть столько, если 50, если

Dram #:
Каждый подмассив 3-го уровня длинной 50  (как и у исходного).


D
На сайте с 28.06.2008
Offline
1113
#15

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

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

T7
На сайте с 19.09.2018
Offline
63
#16

Вы можете для проверки, лошадью сходить.

function _a(array &$a, array &$b, array $c){
  foreach($c as $v){
    $a[$v] = $b[$v];
  }
}

Увидеть индексы исходного, которые добавились

В моем случае оно дало:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

            [1] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

            [3] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

            [4] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

            [5] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

        )

    [1] => Array
        (
            [6] => Array
                (
                    [0] => 0
                    [1] => 1
                    [2] => 0
                )

            [7] => Array
                (
                    [0] => 0
                    [1] => 1
                    [2] => 0
                )

        )

)

Нетрудно заметить, добавились для

0  [0,0,0], в [0]
1  [0,0,0], в [0]
2  [0,1,0],
3  [0,0,0], в [0]
4  [0,0,0], в [0]
5  [0,0,0], в [0]
6  [0,1,0], в [1]
7  [0,1,0], в [1]
8  [0,0,0],
9  [1,1,1],

Точно, пора в санаторий.

D
На сайте с 28.06.2008
Offline
1113
#17

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

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

$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
T7
На сайте с 19.09.2018
Offline
63
#18
Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
            [5] => 0
        )

    [1] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 0
            [8] => 0
        )

    [2] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 0
            [3] => 0
            [4] => 1
            [5] => 0
        )

)
<?php

$oldArray = [
  [0,0,0],
  [0,0,0],
  [0,1,0],
  [0,0,0],
  [0,0,0],
  [0,0,0],
  [0,1,0],
  [0,1,0],
  [0,0,0],
  [1,1,1],
];

$new_a = [];

$l = count($oldArray);
$tmp0 = [];
$tmp1 = [];

function _a(array &$a, array &$b, array $c){
  $aa = [];
  foreach($c as $v){
    $aa = array_merge($aa, $b[$v]);    
  }
  $a[] = $aa;
}

for($i=0;$i<$l;$i++){
  if(!in_array(1, $oldArray[$i])) {    
    if(count($tmp1)>1)  {
      _a($new_a, $oldArray, $tmp1);
    }
    array_push($tmp0, $i);
    $tmp1 = [];
  }  else {    
    if(count($tmp0)>1) {
      _a($new_a, $oldArray, $tmp0);
    }
    array_push($tmp1, $i);
    $tmp0 = [];
  }
}

print_r($new_a);

Если опять не так, то умываю руки. Пардон, что читаю по диагонали, сначала между делом. Но, есть и плюс - разные варианты разобрали.

D
На сайте с 28.06.2008
Offline
1113
#19

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

T7
На сайте с 19.09.2018
Offline
63
#20
Dram #:
Спасибо то что нужно!

Получилось еще одно доказательство, то что ТЗ надо внимательно читать и понятно излагать.  

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий