[PHP] Lijst met booleans combineren naar 1 boolean

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Misschien een beetje een rare vraag; ik zal het hieronder proberen uit te leggen:

Ik heb een array met daarin een (variabel) aantal booleans. Bijvoorbeeld
PHP:
1
$bool_arr = array(true, false, true, false, false);

Nu wil ik deze array combineren naar een boolean met behulp van een operator: AND of OR.

Ik heb hiernaar gezocht maar kan niets vinden op google. De enige taaltjes die hier "standaard" ondersteuning voor bieden zijn taaltjes als Haskell en Clean (special or() en and() functie)

Het enige wat ik zou kunnen bedenken, en dat is een oplossing die gewoon te vatzig voor woorden is, is het opbouwen van een regel PHP code en die door eval() halen.

Iemand een ander idee?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Maak zelf zo'n functie aan :?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • jopiek
  • Registratie: September 2000
  • Laatst online: 20-09 20:01

jopiek

Tja... 'ns ff denken.

Verwijderd schreef op maandag 23 mei 2005 @ 11:25:
Misschien een beetje een rare vraag; ik zal het hieronder proberen uit te leggen:

Ik heb een array met daarin een (variabel) aantal booleans. Bijvoorbeeld
PHP:
1
$bool_arr = array(true, false, true, false, false);

Nu wil ik deze array combineren naar een boolean met behulp van een operator: AND of OR.

Ik heb hiernaar gezocht maar kan niets vinden op google. De enige taaltjes die hier "standaard" ondersteuning voor bieden zijn taaltjes als Haskell en Clean (special or() en and() functie)

Het enige wat ik zou kunnen bedenken, en dat is een oplossing die gewoon te vatzig voor woorden is, is het opbouwen van een regel PHP code en die door eval() halen.

Iemand een ander idee?
het lijkt me dat je gewoon door de array loopt met een functie en dan een AND of een OR uitvoert op alle variabelen:

while ($array_value = current($bool_arr))
{
$result = $result OR current($bool_arr); //desgewenst een AND
next($bool_arr);
}

Zorg alleen wel dat je dus $result eerst ff initialiseert op de eerste array plaats of zo.

Cogito Ergo Credo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja kee en dan? (sloeg op de reply van whoami)

Een or operator is niet communicatief: het resultaat van deze operator gaat over het gehele resultaat: Ik moet dus die OR op de gehele array in een keer kunnen loslaten:

(((1 or 1) or 0) or 0) is iets anders als (1 or 1 or 0 or 1)

Bij de and operator kan dit wel:

((1 and 1) and 0) and 0) is wel hetzelfde als (1 and 1 and 0 and 0)

De oplossing met de haakjes is zo te implementeren: maar deze oplossing is dus niet de oplossing die ik moet hebben.

Hoe ik dit wel oplos weet ik zo snel even niet... Ik ga iig eerst even kijken hoe Haskell dit doet... Ik hoop dat iemand hier toch al een keer over na heeft gedacht ;)

[ Voor 3% gewijzigd door Verwijderd op 23-05-2005 11:34 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op maandag 23 mei 2005 @ 11:25:
Ik heb hiernaar gezocht maar kan niets vinden op google. De enige taaltjes die hier "standaard" ondersteuning voor bieden zijn taaltjes als Haskell en Clean (special or() en and() functie)
nou zo speciaal zijn die functies niet. Is eigenlijk gewoon een foldl met een logische or of een logische and.

In PHP kan zoiets wel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function or( $list ) {

  $return = false;
  $list_size = count( $list );  

  for( $i = 0; $i< $list_size; ++$i ) {

    if( !$return )
      break;

    $return = $list[i] || $return;
  }

  return $return;
}

[ongetest]

[edit] Err, zowel de disjunctie als de conjunctie voldoen aan de wetten van de Commutativity

[ Voor 21% gewijzigd door Glimi op 23-05-2005 11:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ook een manier ja ;) bedankt. zo had ik er nog niet over na gedacht :)

Als ik het me goed herinner is || niet communicatief en && wel. De precieze definitie van "communicatief" kan ik me niet herinneren; maar het heeft te maken met de volgorde en doorwerking van de operator als er bijvoorbeeld haakjes worden gebruikt: zie (((1 of 1) of 0) of 0) voorbeeld in mijn vorige post: dan snap je wel wat ik bedoel... thanks anyway

Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Of ik snap 't niet, of ik snap 't niet.

maar:

PHP:
1
2
3
4
function a_or($arr)
{
    return !in_array(false, $arr);
}

moet toch werken voor OR ?

of heb ik nou snel een AND geschreven?
ik snap mezelf niet eens meer.

[ Voor 23% gewijzigd door GX op 23-05-2005 11:52 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op maandag 23 mei 2005 @ 11:45:
Ook een manier ja ;) bedankt. zo had ik er nog niet over na gedacht :)

Als ik het me goed herinner is || niet communicatief en && wel. De precieze definitie van "communicatief" kan ik me niet herinneren; maar het heeft te maken met de volgorde en doorwerking van de operator als er bijvoorbeeld haakjes worden gebruikt: zie (((1 of 1) of 0) of 0) voorbeeld in mijn vorige post: dan snap je wel wat ik bedoel... thanks anyway
:?
Verwijderd schreef op maandag 23 mei 2005 @ 11:33:
(((1 or 1) or 0) or 0) is iets anders als (1 or 1 or 0 or 1)
code:
1
2
3
4
5
6
7
(((1 or 1) or 0) or 0)
=
((1 or 0) or 0)
=
(1or 0)
=
1

code:
1
2
3
(1 or 1 or 0 or 1)
=
1

Sowieso dat je het tweede voorbeeld kunt opschrijven betekend dat de operator voldoet aan de associativity. Even ter duidelijkheid voor je:
Commutativty:
A and B == B and A
A or B == B or A
Associativity:
(A and B ) and C == A and (B and C)
(A or B ) or C == A or (B or C)

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
GX schreef op maandag 23 mei 2005 @ 11:46:
of heb ik nou snel een AND geschreven?
ik snap mezelf niet eens meer.
Dit is een and, voor de or moet je scannen op een true.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jij hebt er duidelijker beter opgelet tijdens die les ;)

Probleem is opgelost met in_array oplossing. Beetje een workaround (ik laat dan de operatoren niet echt "los" op het invoer) maar goed het werkt. Bedankt allemaal

Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Glimi schreef op maandag 23 mei 2005 @ 11:54:
[...]

Dit is een and, voor de or moet je scannen op een true.
Dan gewoon de ! weghalen en false door true vervangen :P Heerlijk compact.
Pagina: 1