считать строку и столбец с условиями в массиве 2D - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть массив 2D следующим образом:

$arrRes = array(  
                array("2018-08-01"=>"X" , "2018-08-02"=>"O" , "2018-08-03"=>"O" , "2018-08-04"=>"O"),
                array("2018-08-01"=>"X" , "2018-08-02"=>"X" , "2018-08-03"=>"O" , "2018-08-04"=>"O"),
                array("2018-08-01"=>"X" , "2018-08-02"=>"X" , "2018-08-03"=>"O" , "2018-08-04"=>"X"),
                array("2018-08-01"=>"X" , "2018-08-02"=>"O" , "2018-08-03"=>"O" , "2018-08-04"=>"O"),
           );  

Как считать "X" и "O" в массиве строк и столбцов? я хочу результат:

// строка числа "X":

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

// НОМЕРНАЯ СТРОКА "O":

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

// КОЛОННА ЧИСЛА "X"

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

// КОЛОННА НОМЕРА "O"

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

Я пытался, но я в замешательстве:

foreach($arrRes as $keyRow => $row){
       foreach($row as $keyCol => $col){
            if($col == 'X'){
            ????     
             }elseif($col == 'O'){
            ????     
             }
      } 
    } 

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Используя ответ splash58 в качестве отправной точки, я добавил различные части, чтобы, надеюсь, завершить его.

Я использую array_merge(['X' => 0, 'O' => 0], array_count_values($row));, что всегда гарантирует, что записи «X» и «O» существуют, это отображается больше в столбцах, чем в строках.

Для столбцов я использую array_column(), чтобы извлечь каждый столбец и обработать его так же, как строки.

$arrRes = array(
    array("2018-08-01"=>"X" , "2018-08-02"=>"O" , "2018-08-03"=>"O" , "2018-08-04"=>"O"),
    array("2018-08-01"=>"X" , "2018-08-02"=>"X" , "2018-08-03"=>"O" , "2018-08-04"=>"O"),
    array("2018-08-01"=>"X" , "2018-08-02"=>"X" , "2018-08-03"=>"O" , "2018-08-04"=>"X"),
    array("2018-08-01"=>"X" , "2018-08-02"=>"O" , "2018-08-03"=>"O" , "2018-08-04"=>"O"),
);  
$row =[];
$col = [];
foreach($arrRes as $row){
    $res[] = array_merge(['X' => 0, 'O' => 0], array_count_values($row));
}
$rowX = array_column($res,"X");
$rowO = array_column($res,"O");
foreach($arrRes[0] as $key => $row){
    $col[] = array_merge(['X' => 0, 'O' => 0], 
            array_count_values(array_column($arrRes,$key)));
}
$colX = array_column($col,"X");
$colO = array_column($col,"O");

print_r($rowX);
print_r($rowO);
print_r($colX);
print_r($colO);

Это дает в качестве вывода ...

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 1
)
Array
(
    [0] => 3
    [1] => 2
    [2] => 1
    [3] => 3
)
Array
(
    [0] => 4
    [1] => 2
    [2] => 0
    [3] => 1
)
Array
(
    [0] => 0
    [1] => 2
    [2] => 4
    [3] => 3
)
0 голосов
/ 10 сентября 2018

Разрешенный / распутанный фрагмент кода, чтобы помочь вам достичь вашего результата

$printers = array(
    array("2018-08-01" => "X", "2018-08-02" => "O", "2018-08-03" => "O", "2018-08-04" => "O"),
    array("2018-08-01" => "X", "2018-08-02" => "X", "2018-08-03" => "O", "2018-08-04" => "O"),
    array("2018-08-01" => "X", "2018-08-02" => "X", "2018-08-03" => "O", "2018-08-04" => "X"),
    array("2018-08-01" => "X", "2018-08-02" => "O", "2018-08-03" => "O", "2018-08-04" => "O"),
);
//PrinterFilter class to filter our iterator and ONLY return values that start with Printer_
class PrinterFilter extends FilterIterator
{
    public function accept()
    {
        //Only accept values that start with Printer_
        if (false !== strpos(parent::current(), 'X') || false !== strpos(parent::current(), 'O')) {
            return true;
        }
        return false;
    }
}
//Create a new Iterator for the array
//Create a RecursiveArrayIterator around our array
//Create a RecursiveIteratorIterator around that so we can easily navigate it
//Create a PrintFilter interator around that so we can filter
$iterator = new PrinterFilter(new RecursiveIteratorIterator(new RecursiveArrayIterator($printers)));
$counts   = array();
$i        = 0;
$j        = 0;
//Simply iterate over the iterator add new keys as necessary
//Increment existing keys.
foreach ($iterator as $key => $value) {
    $result['rows'][$value][$i] = (isset($counts[$value]) ? ++$counts[$value] : ($counts[$value] = 1));
    $result['cols'][$value][$j] = (isset($result['cols'][$value][$j]) ? ++$result['cols'][$value][$j] : 1);
    $j++;
    if ($j % 4 == 0) {
        $i++;
        $j      = 0;
        $counts = [];
    }
}
foreach ($result['cols'] as $key => $value) {
    $newKeys = array_fill_keys(range(0, 3), 0);
    $result['cols'][$key] += $newKeys;
    ksort($result['cols'][$key]);
}
pr($result);

Здесь работает код .

0 голосов
/ 09 сентября 2018

Если ваши значения известны (X / O), вы можете предварительно создать массив результатов. Затем переберите существующий массив и увеличьте число row / col на основе значения и положения строки / столбца. Используйте array_search ( .. array_keys () ), чтобы получить индекс ключа ассоциативного ключа.

$arraySum = [
             'rows' => ['X'=>[0,0,0,0],'O'=>[0,0,0,0]],
             'cols' => ['X'=>[0,0,0,0],'O'=>[0,0,0,0]]
            ];

foreach($arrRes as $keyRow => $row){
   foreach($row as $keyCol => $col){
      $arraySum['rows'][$col][$keyRow]++;
      $arraySum['cols'][$col][array_search($keyCol,array_keys($row))]++; 
  } 
}

демо - https://3v4l.org/ROTMP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...