Goedenavond,

Zie graag onderstaand voorbeeld, is er een manier om dit korter schrijven dan met 3 keer "$aArray['test'][$vValue]"?
Om redenen die niet zijn opgenomen in dit voorbeeld is hier een multidimensionale-array nodig, vandaar nu de 'test'-key.
N.b.: Ik ben me bewust van simpele functies als bijvoorbeeld count() en het gaat vanzelfsprekend niet om het opzoeken van het aantal keer dat 'a' voorkomt in $aVoorbeeld, dat zou een andere vraag zijn, het gaat mij om het korter schrijven van de regel waarop de key's worden aangemaakt zonder een Notice te krijgen dat de key niet bestaat (wanneer je bijvoorbeeld "$aArray['test'][$vValue]++;" of "$aArray['test'][$vValue] += 1;" zou doen:

<?php

$aVoorbeeld = array('a', 'b', 'c', 'a', 'a', 'c', 'd');

$aArray = array();
foreach($aVoorbeeld AS $vValue)
{
$aArray['test'][$vValue] = isset($aArray['test'][$vValue]) ? $aArray['test'][$vValue] + 1 : 1;
}

print_r($aArray);

/*
Gewenste output:

Array
(
[test] => Array
(
[a] => 3
[b] => 1
[c] => 2
[d] => 1
)

)

*/
?>

Ik hoor het graag!
Bedankt Thomas,

Dit had ik zelf ook voor elkaar op deze manier:

<?php

$test = array('key_1', 'a', 'b', 'b', 'c', 'key_2', 'a', 'a', 'c', 'd', 'd');

$currentKey = '';
foreach($test AS $vValue)
{
if(substr($vValue, 0, 4) === 'key_')
{
$currentKey = $vValue;
}
else
{
$out[$currentKey][] = $vValue;
}
}

echo '<pre>' . print_r($out, true) . '</pre>';

?>

Ja ok, maar dan ben je er toch al? Voer array_count_values() uit op elk van de subarrays en klaar?
Dat klopt inderdaad Thomas, maar waarom zou dat je voorkeur hebben boven de oplossing uit mijn eerste post?


En om dan nog een beetje flauw te doen, is er echt geen oplossing om dit korter en netter te doen i.p.v. met 3 keer hetzelfde:

$aArray['test'][$vValue] = isset($aArray['test'][$vValue]) ? $aArray['test'][$vValue] + 1 : 1;
Blijkbaar is het op een bepaalde manier relevant dat je alles groepeert op key, zodat je daarna makkelijk(er) kunt gaan tellen. Waarom zou je datastructuur dit dan niet reflecteren?

Daarnaast zoek je enkel naar een "kortste oplossing" voor dit specifieke probleem, maar hoe gebruik je deze data verder? Dit zou moeten bepalen hoe je datastructuur er uit ziet, zodat je hier -in het algemeen- makkelijk mee kunt werken.

Wat is er op tegen om een probleem op te splitsen in deelproblemen, die mogelijk ook andere zaken gelijk tacklen (zoals het opzetten van een datastructuur die makkelijker is in het gebruik), in plaats van enkel een ad hoc oplossing te schrijven die enkel geschikt is voor een direct probleem?
Duidelijk verhaal Thomas, hartelijk dank voor het meedenken!

$aArray['test'][$vValue] = isset($aArray['test'][$vValue]) ? $aArray['test'][$vValue] + 1 : 1;


Dit is al een verkort geschreven stukje code voor een IF-THEN-ELSE

Wil je het duidelijker dan kan je het als volgt doen :


     if (isset($aArray['test'][$vValue]))
        $aArray['test'][$vValue] = $aArray['test'][$vValue] + 1;
     else $aArray['test'][$vValue] = 1;



De coderegel na het if-statement kan eventueel alsvolgt geschreven worden :


     $aArray['test'][$vValue]++;


Dat is wel iets korter.
<?php
$aVoorbeeld = array('key_1', 'a', 'b', 'b', 'c', 'key_2', 'a', 'a', 'c', 'd', 'd');
$aArray = array();

$key = '';
while($shift = array_shift($aVoorbeeld))
{
if(substr($shift, 0, 3) == 'key')
{
$key = $shift;
$aArray[$key] = array();
}
else
{
$aArray[$key][$shift] = isset($aArray[$key][$shift]) ? $aArray[$key][$shift]+1 : 1;
}
}

print_r($aArray);
?>

Reageren