Toon posts:

[php] filter where xor

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste,

ik ben bezig met een filter (where) filter voor json. nu is het tijd voor xor implementatie (de and & or zitten erin).

Mijn huidige implementatie voor de and & or gaat uit van sets, pakt telkens de diepste set, pak de eerste 3 arrays van de set en los deze op als 1 set en plaatst die terug (dus hij lost telkens 1 vergelijking op) en vergelijkt dan met de volgende vergelijking.

Nu voor een dubbele xor heb ik al even op wikipedia gekeken en zijn er 2 oplossingen mogelijk:

de xor uniek laten lijken op alle elementen: dus
0 0 0 geeft 0,
0 0 1 geeft 1,
0 1 0 geeft 1,
0 1 1 geeft 0,
1 0 0 geeft 1,
1 0 1 geeft 0
1 1 0 geeft 0,
1 1 1 geeft 0
of de implementatie maken zoals de huidige and en or zijn:
dus
0 0 0 geeft 0,
0 0 1 geeft dan 1, door 0 0 = 0 en 0 1 = 1
0 1 0, geeft 1,
0 1 1, geeft 0 door 0 1 = 1 en 1 1 = 0
1 0 0, geeft 1 door 1 0 = 1 en 1 0 = 1
1 0 1, geeft 0, door 1 0 = 1 en 1 1 = 0
1 1 0, geeft 0, door 1 1 = 0 en 0 0 = 0
1 1 1 geeft 1 door 1 1 = 0, 0 1 = 1

Nu zit ik er over na te denken over de implemtatie maar wellicht kan ik beter die termen dan toevoegen als men dit gewenste resultaat wil:

one-hot ,
parity-generator

maar wat is de default van een xor (one-hot ?)


...

Relevante software en hardware die ik gebruik

code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{{R3M}}
{{$response = R3m.Io.Node:Data:list('Event', [
'sort' => [
'options.priority' => 'ASC',
'action' => 'ASC'
],
'where' => [
    '(',
    [
    'attribute' => 'options.priority',
    'value' => 1,
    'operator' => '==='
    ],
    'or',
    '(',
    [
    'attribute' => 'options.priority',
    'value' => 11,
    'operator' => '==='
    ],
    'and',
    [
    'attribute' => 'action',
    'value' => '...',
    'operator' => '==='
    ],
    ')',
    'or',
    '(',
    [
    'attribute' => 'options.priority',
    'value' => 10,
    'operator' => '==='
    ],
    'and',
    [
    'attribute' => 'action',
    'value' => '...',
    'operator' => '==='
    ],
    ')',
    ')'
],
'limit' => (int) $options.limit,
'page' => (int) $options.page
])}}


Wat ik al gevonden of geprobeerd heb

Wikipedia: XOR gate
Wikipedia: Exclusive or
...

[ Voor 31% gewijzigd door Verwijderd op 21-04-2023 13:28 ]

Beste antwoord (via Verwijderd op 22-04-2023 14:55)


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 30-09 20:12

dusty

Celebrate Life!

[...]en los deze op als 1 set en plaatst die terug (dus hij lost telkens 1 vergelijking op) en vergelijkt dan met de volgende vergelijking.
1 1 1 ->

1e vergelijking ; 1 xor 1 = 0
2e vergelijking : 0 xor 1 = 1

Dus de logica in de quote werkt als bedoeld maar niet zoals je wilt :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Alle reacties


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 30-09 20:12

dusty

Celebrate Life!

Een andere oplossing is dat je alles kan "optellen/Sum". Daarna kan je een 1 terug geven als de sum exact 1 is.. Als het een ander nummer dan 1 is geef je een 0 terug. (en dan maakt het ook niet meer uit of het 2, 3 of meer elementen zijn)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dusty schreef op vrijdag 21 april 2023 @ 14:32:
Een andere oplossing is dat je alles kan "optellen/Sum". Daarna kan je een 1 terug geven als de sum exact 1 is.. Als het een ander nummer dan 1 is geef je een 0 terug. (en dan maakt het ook niet meer uit of het 2, 3 of meer elementen zijn)
dat is ook een goeie, dus jij gaat ook uit van de one-hit standaard.

ik wilde een oplossing als volgt maken: alles eerst oplossen naar bolean values (dus van de huide arrays een boolean maken) en dit bijhouden in een array. dan voor or zoeken naar een true, voor xor jouw methode en voor and de oude methode gebruiken. :)

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 30-09 20:12

dusty

Celebrate Life!

Voor de "AND" kan je ook een sum gebruiken; Als de sum het nummer van elementen is stuur je een 1 terug, anders 0.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu de bestaande oplossing gebruikt. One Hot moet met sets en parity generator zonder sets.

Ik zie net dat sets niet werkt 1 1 1 geeft dan 1

[ Voor 21% gewijzigd door Verwijderd op 21-04-2023 17:46 ]


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 30-09 20:12

dusty

Celebrate Life!

[...]en los deze op als 1 set en plaatst die terug (dus hij lost telkens 1 vergelijking op) en vergelijkt dan met de volgende vergelijking.
1 1 1 ->

1e vergelijking ; 1 xor 1 = 0
2e vergelijking : 0 xor 1 = 1

Dus de logica in de quote werkt als bedoeld maar niet zoals je wilt :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb ff lopen nadenken over de nieuwe implementatie en kom er niet uit. Optellen gaat alleen maar als het allemaal dezelfde operators zijn. De andere implementatie zou denk ik heel moeilijk oplosbaar zijn, bijna alle mogelijke combinaties moeten uitschrijven.

Ik denk dat ik alleen xor en xor xor uitschrijf en deze dan implementeer. Dan kun je volgens mij ook nog xor xor and of xor xor or etc. Ik denk dat ik voor een one hit een andere functie kan schrijven in een foreach, dus dat kan dan op die manier.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
deze werkt nu:
code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
{{R3M}}
Duration: 0.36 msec
/tmp/r3m/io/a83516cd-1f8d-4a9c-9c50-6b516a114980/0/Compile/Template_Event_Patch_f8897b25adc1d65bba614836f9ec135fe57e12fc.php:91
array(5) {
  ["page"]=>
  int(1)
  ["limit"]=>
  int(255)
  ["list"]=>
  array(1) {
    [0]=>
    object(stdClass)#902 (5) {
      ["uuid"]=>
      string(36) "34731ffa-4d1c-46dd-9b1f-539c49679c50"
      ["index"]=>
      int(0)
      ["key"]=>
      string(40) "1ebee5ea2ee677b97e9f6544d28be69f1558b3b5"
      ["read"]=>
      object(stdClass)#898 (5) {
        ["load"]=>
        int(1)
        ["seek"]=>
        float(4)
        ["lines"]=>
        int(9)
        ["percentage"]=>
        float(11.11)
        ["url"]=>
        string(75) "/Application/Data/Node/Storage/34/34731ffa-4d1c-46dd-9b1f-539c49679c50.json"
      }
      ["node"]=>
      object(stdClass)#847 (4) {
        ["action"]=>
        string(3) "yyy"
        ["options"]=>
        object(stdClass)#846 (3) {
          ["command"]=>
          array(0) {
          }
          ["controller"]=>
          array(0) {
          }
          ["priority"]=>
          int(11)
        }
        ["uuid"]=>
        string(36) "34731ffa-4d1c-46dd-9b1f-539c49679c50"
        ["#class"]=>
        string(5) "Event"
      }
    }
  }
  ["sort"]=>
  array(2) {
    ["options.priority"]=>
    string(3) "ASC"
    ["action"]=>
    string(3) "ASC"
  }
  ["where"]=>
  array(15) {
    [0]=>
    string(1) "("
    [1]=>
    array(3) {
      ["attribute"]=>
      string(16) "options.priority"
      ["value"]=>
      int(1)
      ["operator"]=>
      string(3) "==="
    }
    [2]=>
    string(3) "xor"
    [3]=>
    string(1) "("
    [4]=>
    array(3) {
      ["attribute"]=>
      string(16) "options.priority"
      ["value"]=>
      int(11)
      ["operator"]=>
      string(3) "==="
    }
    [5]=>
    string(3) "and"
    [6]=>
    array(3) {
      ["attribute"]=>
      string(6) "action"
      ["value"]=>
      string(3) "yyy"
      ["operator"]=>
      string(3) "==="
    }
    [7]=>
    string(1) ")"
    [8]=>
    string(3) "xor"
    [9]=>
    string(1) "("
    [10]=>
    array(3) {
      ["attribute"]=>
      string(16) "options.priority"
      ["value"]=>
      int(12)
      ["operator"]=>
      string(3) "==="
    }
    [11]=>
    string(3) "and"
    [12]=>
    array(3) {
      ["attribute"]=>
      string(6) "action"
      ["value"]=>
      string(6) "utyrrt"
      ["operator"]=>
      string(3) "==="
    }
    [13]=>
    string(1) ")"
    [14]=>
    string(1) ")"
  }
}


die laatste xor geeft false omdat zijn priority 11 moet zijn

en onder water maakt ie er een " .. xor .. xor .. " van en los ik dat op met deze code:

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
26
27
28
29
$operator = 'xor';
$list = [];
$list[] = $record;
if($set[1] === $operator){
    $is_true = 0;
    foreach($set as $true){
        if(is_array($true)){
            $filter_where = [
                'node.' . $true['attribute'] => [
                    'value' => $true['value'],
                    'operator' => $true['operator']
                ]
            ];
            $current = Filter::list($list)->where($filter_where);
            if(!empty($current)){
                $is_true++;
            }
        }
        elseif($true === true){
            $is_true++;
        }
    }
    if($is_true === 1){
        $where[$key] = true;
        return $set;
    }
    $where[$key] = false;
    return $set;
}

[ Voor 52% gewijzigd door Verwijderd op 22-04-2023 14:51 ]

Pagina: 1