Ik heb de volgende array:


Array
(
    [2019] => Array
        (
            [Werkplek opgeruimd] => 6
            [Keuringsstickers op arbeidsmiddelen] => 1
            [Veilig gebruikte gereedschappen] => 2
            [Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist] => 3
            [Veilige werkmethodes] => 3
        )

    [2020] => Array
        (
            [Veilig gebruikte gereedschappen] => 1
            [Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist] => 2
            [Veilige werkmethodes] => 2
            [Werkplek opgeruimd] => 1
            [Materialen opslag veilig] => 1
        )

)


Hij is opgebouwd met het jaartal als key, daarin checklistvragen als key met als value het aantal afwijkingen (dit houd in situaties die niet OK waren).

Ik wil in een overzicht tonen hoeveel afwijkingen er waren per vraag, per jaar.

Op deze manier:


<table class="table table-hover">
   <thead>
      <tr>
         <th>Vraag</th>
         <th>2019</th>
         <th>2020</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>Werkplek opgeruimd</td>
         <td>6</td>
         <td>1</td>
      </tr>
      <tr>
         <td>Keuringstickers op arbeidsmiddelen</td>
         <td>1</td>
         <td>0</td>
      </tr>
   </tbody>
</table>


Etc

Hoe kan ik die gegevens op de juiste manier krijgen uit een loop? Alle vragen die een afwijking hebben moeten dus onder elkaar komen te staan (geen dubbele) met daarnaast per jaar hoeveel die afwijking voorkomt.
Kijk eens naar de array_diff() functie.
- Ariën - op 15/09/2020 13:24:44

Kijk eens naar de array_diff() functie.


Heb erover gelezen maar alsnog lastig de gewenste output te krijgen.

Met onderstaande output zou het makkelijk lukken:


Array
(
	[Werkplek opgeruimd] => Array
	(
		[2019] => 6
		[2020] => 1
	)

	[Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist] => Array
	(
		[2019] => 3
		[2020] => 2
	)

	[Materialen opslag veilig] => Array
	(
		[2019] => 0
		[2020] => 1
	)
)

Etc.
Maar het is de vraag hoe ik bovenstaand zo kan krijgen vanuit deze array opmaak:



Array
(
    [2019] => Array
        (
            [Werkplek opgeruimd] => 6
            [Keuringsstickers op arbeidsmiddelen] => 1
            [Veilig gebruikte gereedschappen] => 2
            [Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist] => 3
            [Veilige werkmethodes] => 3
        )

    [2020] => Array
        (
            [Veilig gebruikte gereedschappen] => 1
            [Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist] => 2
            [Veilige werkmethodes] => 2
            [Werkplek opgeruimd] => 1
            [Materialen opslag veilig] => 1
        )

)

Of je doet even ingewikkeld en je hebt precies wat je wilt.

Werkt ook als er een nieuw jaar bij komt.


<?php
# error reporting
ini_set('display_errors', 1);
error_reporting(E_ALL);

$array = array(	2019 => Array(	'Werkplek opgeruimd' => 6,
								'Keuringsstickers op arbeidsmiddelen' => 1,
								'Veilig gebruikte gereedschappen' => 2,
								'Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist' => 3,
								'Veilige werkmethodes' => 3
							),
				2020 => Array(	'Veilig gebruikte gereedschappen' => 1,
								'Persoonlijke beschermingsmiddelen aanwezig, deugdelijk en juist' => 2,
								'Veilige werkmethodes' => 2,
								'Werkplek opgeruimd' => 1,
								'Materialen opslag veilig' => 1
							)
				); 
				
$arrayyears = array();
$arraykeys = array();
foreach($array as $year => $value)
{	$arrayyears[] = $year;
	foreach($value as $key => $v)
	{	$arraykeys[] = $key;
	}
}
$arraykeys = array_unique($arraykeys);
?>

<table class="table table-hover">
   <thead>
      <tr>
         <th>Vraag</th>
<?php
	foreach($arrayyears as $year) echo '<th>'.$year.'</th>';
?>
      </tr>
   </thead>
   <tbody>
<?php
	foreach($arraykeys as $key)
	{	echo '<tr><td>'.$key.'</td>';
		foreach($arrayyears as $year) echo '<td>'.@$array[$year][$key].'</td>';
		echo '</tr>';
	}
?>
   </tbody>
</table> 
Volgens mij bedoel je meer dit:
<?php

$array = [...]; //zie hierboven

$values = $diff = [];

foreach($array as $record) foreach($record as $key => $value){
  if(!array_key_exists($key,$values)){
    $values[$key] = $value; //referentie waarde
    $diff[$key] = false; //waarde wijkt niet of tov ref (duh)
  }
  elseif($value != $values[$key]) $diff[$key] = true; //afwijkende waarde
}

$keys = array_keys(array_filter($diff)); //voor deze keys wijkt de waarde af

print('<table><thead><tr><th>Vraag</th>');
foreach($keys as $key) print("<th>$key</th>");
print('</tr></thead><tbody>');

foreach($array as $year => $record){
  print("<tr><td>$year</td>");
  foreach($keys as $key) print("<td>{$record[$key]}</td>");
  print('</tr>');
}

print('</tbody></table>');

?>
@Rob Doemaarwat: Maar bij jou missen er enkele waarden.
Mja er missen enkele waarden voor bepaalde jaartallen (Keuringsstickers voor 2020 en Materialen opslag voor 2019).

Er zijn verschillende manieren om deze "gaten" nog op te vullen, maar het principe (rijen en kolommen verwisselen) blijft in grote lijnen hetzelfde.
O zo, het is ook de bedoeling dat keys die niet in het alle records zitten als "0" worden gezien (en dus ook hoogstwaarschijnlijk "niet gelijk"). Maar bij SanThe krijg je juist alle waarden, ook als ze in alle records gelijk zijn, en dat is volgens mij ook niet de bedoeling - het gaat om het aantal "afwijkingen" (?).
<?php

$array = [...]; //zie hierboven

$values = []; //hierin worden de referentie waarden verzameld
foreach($array as $record) $values += $record;
$diff = array_fill_keys($keys = array_keys($values),false); //init allen op false

foreach($array as $record) foreach($keys as $key)
  if(($record[$key] ?? 0) != $values[$key]) $diff[$key] = true; //diffs detecteren
$keys = array_keys(array_filter($diff)); //kolommen met een diff (niet meer false)

print('<table><thead><tr><th>Vraag</th>');
foreach($keys as $key) print("<th>$key</th>");
print('</tr></thead><tbody>');

foreach($array as $year => $record){
  print("<tr><td>$year</td>");
  foreach($keys as $key) print('<td>' . ($record[$key] ?? 0) . '</td>');
  print('</tr>');
}

print('</tbody></table>');

?>
Bedankt, ik heb het op kunnen lossen.

Reageren