[PHP] Array splitsen on value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Ik heb de volgende array

PHP:
1
2
3
$aArray['ID']   = array(1, 2, 3, 4, 5, 6, 7, 8)
$aArray['naam'] = array("c", "d", "f", "g", "h", "i", "j", "k")
$aArray['type'] = array(10, 20, 10, 30, 40, 30, 20, 10)


en die moet worden:

PHP:
1
2
3
$aArray['10'] = array (['ID']=>array(1, 3, 8), ['naam']=>array("c", "f", "k"));
$aArray['20'] = array (['ID']=>array(2, 7), ['naam']=>array("d", "j"));
etc.


Met andere woorden: in de eerste array heb je keys 'ID', 'naam' en 'type'; in de tweede array zijn de values van 'type' de key geworden.

Hoe kan dit mooi en netjes in een functie gieten? Ben al wel begonnen, maar loop nu vast:

PHP:
1
2
3
4
5
6
7
8
9
10
function array_splitonkey($aArray, $sKey)
{  
  $aKeyValues = array_unique($aArray[$sKey]);
  
  foreach ($aKeyValues as $iNr=>$sName)
  {
    $aReturn[$sName]= /* vul array hier */
  }   
  
}

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Misschien moet je eerst eens vertellen hoe je denkt die waardes op die manier te gaan koppelen. Met de informatie die je nu geeft is het mij een raadsel waarom type 10 gekoppeld moet worden aan de ID's 1, 3 en 8 met de waarden c, f en k. Ok, nu zie ik het wel, was nog niet helemaal wakker. Dat neemt overigens niet weg dat een woordelijke omschrijving altijd beter is dan dat wij je bedoeling maar uit je code moeten halen. :)

Sowieso snap ik niet waarom je een ID- en een naamveld hebt wanneer dat ID blijkbaar prima kan functioneren als key in je array. :)

[ Voor 21% gewijzigd door NMe op 24-02-2007 16:04 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat kan wel op deze manier:
PHP:
1
2
3
4
5
6
$array = array();
foreach ( $aArray['type'] as $index => $type )
{
  $array[$type]['ID'][] = $aArray['ID'][$index];
  $array[$type]['naam'][] = $aArray['naam'][$index];
}

[ Voor 3% gewijzigd door Michali op 24-02-2007 16:00 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Met array_unique kun je de unieke elemtenen uit 'type' halen. Daarna kun je met array_keys (let op tweede parameter) de bijbehorende indices ophalen, en met die indices kun je de gegevens uit de andere arrays halen.

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Ok, nu zie ik het wel, was nog niet helemaal wakker. Dat neemt overigens niet weg dat een woordelijke omschrijving altijd beter is dan dat wij je bedoeling maar uit je code moeten halen. :)
:? Dat had ik toch gedaan met

"Met andere woorden: in de eerste array heb je keys 'ID', 'naam' en 'type'; in de tweede array zijn de values van 'type' de key geworden.".

Maar goed, blijkbaar niet uitgebreid/duidelijk genoeg :)
Sowieso snap ik niet waarom je een ID- en een naamveld hebt wanneer dat ID blijkbaar prima kan functioneren als key in je array. :)
Deze array is een willekeurig voorbeeldje...

@Michali: dank, maar ik probeer een generieke functie te schrijven, die voor ieder willekeurige array werkt...

@Glowmouse: wat bedoel je precies met indices?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Rekcor schreef op zaterdag 24 februari 2007 @ 16:46:
Maar goed, blijkbaar niet uitgebreid/duidelijk genoeg :)
Ik kon het er in elk geval niet uithalen. :P
@Michali: dank, maar ik probeer een generieke functie te schrijven, die voor ieder willekeurige array werkt...
Als je niet een bepaalde structuur hebt waar je vanuit kan gaan wordt het verdomd lastig om een generieke functie te schrijven. :)
@Glowmouse: wat bedoel je precies met indices?
Het meervoud van "index", een manier om een element van een array aan te spreken dus.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Het is misschien geen gek idee om te vertellen wat je precies wil doen, ipv vragen hoe je iets moet doen. Voor hetzelfde geld kan het op een eenvoudigere (en betere) manier. Zelf begrijp ik nog niet geheel wat je wil met zo'n opstelling.

[ Voor 4% gewijzigd door prototype op 24-02-2007 18:45 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Op deze manier kan het generiek:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

function array_splitonkey($inputArray, $key)
{
    $outputArray = array();
    $outputKeyArray = $inputArray[$key];
    unset($inputArray[$key]);
    foreach ( $outputKeyArray as $index => $outputKey )
    {
        foreach ( $inputArray as $inputKey => $itemsArray )
        {
            $outputArray[$outputKey][$inputKey][] = $itemsArray[$index];
        } 
    }
    return $outputArray;
}

$aArray = array();
$aArray['ID']   = array(1, 2, 3, 4, 5, 6, 7, 8);
$aArray['naam'] = array("c", "d", "f", "g", "h", "i", "j", "k");
$aArray['type'] = array(10, 20, 10, 30, 40, 30, 20, 10);

var_dump(array_splitonkey($aArray, 'type'));

?>

Geen idee of het nog eenvoudiger kan, ik heb nu geen zin om dat uit te zoeken. :P

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Bedankt voor de reacties!

Ik wil een eenvoudige (2d) associatieve array op een andere manier weergeven op mijn scherm dan de functie print_r.

De array in mijn voorbeeld beschrijft 8 items met drie eigenschappen: 'ID', 'naam' en 'type'. Het eerste item heeft bijv. ID=1, naam="c" en type="10".

Nu wil ik niet weten wat de eigenschappen van een item zijn, maar welke items bij een bepaalde eigenschap horen. Bijv. de eigenschap type=10, welke items hebben deze eigenschap en wat zijn de andere eigenschappen van die items? In mijn voorbeeld:

code:
1
2
3
array(10=>array(0=>array("ID"=>1, "naam"=>"c"), 
                1=>array("ID"=>3, "naam"=>"f"), 
                8=>array("ID"=>8, "naam"=>"k"))


Ik moet dus een functie hebben die de array omschrijft.

Mijn probleem was dat ik bezig was met een generieke functie die de array kon 'omschrijven', maar dat die functie steeds meer geneste loops kreeg 8)7 (waardoor bij mij het vermoeden rees: ik doe iets fout)

De functie van Michali doet het, waarvoor _/-\o_

Acties:
  • 0 Henk 'm!

Verwijderd

volgensmij begint bij mij nu het kwartje te vallen.

wat je dus eigenlijk wilt doen is een lijst met entries welke elk een ID, naam en type hebben sorteren. eigenlijk een soort sortbysubkey eigenlijk, zodat je een array krijgt die is gesorteerd op de waarde van het type. zodat je van elke type de ID en Naam entries kunt aflezen. ik blijf het enegzinds omslachtig vinden vooral omdat je een nogal ingewikkelde en bepaald niet straith-forward approach gebruikt.

ik zou gewoon een array maken met onder elke index een ID, Naam en Type index en dan door de array loopen en elke match in een output array stoppen of zit er geen correlatie tussen ID en Naam?
Pagina: 1