Steve: Funktion zur Addition von Rechten

Hallo!

Ich habe ein Array mit Gruppenrechten für eine bestimmte Funktion.
Die Gruppenrechte werden dabei, wie bei chmod, als Integer von 0-7 gespeichert.

Beispiel:

array(  
    [0] => array(  
               'group_id' => 1,  
               'rights'   => 3  
           )  
    [1] => array(  
               'group_id' => 2,  
               'rights'   => 4  
           )  
)

Ich suche jetzt eine Funktion mit der ich die Rechte addieren kann. In dem Beispiel also zu max 7.
Umgedreht hätte ich auch gern eine Funktion die mir die Integer in entsprechende Rechte umwandeln kann. Als Rückgabewert vielleicht ein Array in der Art:

array(  
    'read'    => true,  
    'write'   => false,  
    'execute' => true  
)

Oder als Rückgabewert:
if(checkRights(7, 'read') == true){ /* read... */}

Mir fehlt nur leider eine konkrete Idee dazu wie ich das am besten umsetzen kann.
Ich habe mir überlegt, die Integer zu Binärzahlen umzuwandeln und dann in einer Schleife die Nullen durch Einsen zu ersetzen. Ist das ein guter Ansatz oder gibt es da bereits etwas besseres?

Ich bin für jede Hilfe dankbar!

  1. Hi,

    Ich habe ein Array mit Gruppenrechten für eine bestimmte Funktion.
    Die Gruppenrechte werden dabei, wie bei chmod, als Integer von 0-7 gespeichert.

    Beispiel:

    array(

    [0] => array(
                   'group_id' => 1,
                   'rights'   => 3
               )
        [1] => array(
                   'group_id' => 2,
                   'rights'   => 4
               )
    )

    
    >   
    > Ich suche jetzt eine Funktion mit der ich die Rechte addieren kann.  
      
    nein, du willst sie nicht addieren, sondern bitweise überlagern. Das leistet die ODER-Verknüpfung.  
      
    
    > Umgedreht hätte ich auch gern eine Funktion die mir die Integer in entsprechende Rechte umwandeln kann. Als Rückgabewert vielleicht ein Array in der Art:  
    > ~~~php
    
    array(  
    
    >     'read'    => true,  
    >     'write'   => false,  
    >     'execute' => true  
    > )
    
    

    Oder als Rückgabewert:
    if(checkRights(7, 'read') == true){ /* read... */}

    Die Abfrage ist natürlich unsinnig - wenn deine (bis jetzt noch hypothetische) Funktion checkRights() sowieso true oder false liefert, ist es sinnlos, diesen Wert nochmal mit true zu vergleichen, nur um wieder denselben Wert zu bekommen. Stattdessen:

    if(checkRights(7, 'read')) { /* read... */}

    Mir fehlt nur leider eine konkrete Idee dazu wie ich das am besten umsetzen kann.

    In dieser Richtung musst du die einzelnen Bits isolieren, also mit einer Maske UND-verknüpfen, beispielsweise:

    if ($group[$i]['rights'] & 4)  // angenommen: 4=read, 2=write, 1=execute  
     { "read" permission set, do something  
     }
    

    Ich habe mir überlegt, die Integer zu Binärzahlen umzuwandeln ...

    Es gibt keine Integer- oder Binärzahlen. Das sind nur unterschiedliche Darstellungen desselben Zahlenwerts. Eine Umwandlung von einem ins andere ist dasselbe wie die Umwandlung von Kartoffeln in Erdäpfel.

    So long,
     Martin

    --
    Wenn man keine Ahnung hat - einfach mal Fresse halten.
      (Dieter Nuhr, deutscher Kabarettist)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Beispiel:

      $arrRights = array(

      [0] => array(
                     'group_id' => 1,
                     'rights'   => 3
                 )
          [1] => array(
                     'group_id' => 2,
                     'rights'   => 4
                 )
      )

      
      > >   
      > > Ich suche jetzt eine Funktion mit der ich die Rechte addieren kann.  
      >   
      > nein, du willst sie nicht addieren, sondern bitweise überlagern. Das leistet die ODER-Verknüpfung.  
        
      Also sowas?  
      ~~~php
        
      $intRights = null;  
      foreach($arrRights as $strKey=>$arrValue){  
          $intRights |= $arrValue['rights'];  
      }  
      
      

      In dieser Richtung musst du die einzelnen Bits isolieren, also mit einer Maske UND-verknüpfen, beispielsweise:

      if ($group[$i]['rights'] & 4)  // angenommen: 4=read, 2=write, 1=execute

      { "read" permission set, do something
      }

        
      Danke dir! Sowas schön kurzes habe ich mir vorgestellt! :)  
        
      
      > Es gibt keine Integer- oder Binärzahlen. Das sind nur unterschiedliche Darstellungen desselben Zahlenwerts. Eine Umwandlung von einem ins andere ist dasselbe wie die Umwandlung von Kartoffeln in Erdäpfel.  
        
      Ja, da habe ich mich ungeschickt ausgedrückt. Herzlichen Dank für deine Hilfe!
      
  2. Tach!

    Ich habe ein Array mit Gruppenrechten für eine bestimmte Funktion. Die Gruppenrechte werden dabei, wie bei chmod, als Integer von 0-7 gespeichert. [...] Ich suche jetzt eine Funktion mit der ich die Rechte addieren kann. In dem Beispiel also zu max 7.

    Das so anzugehen, halte ich für keine besonders gute Idee. Warum willst du die Rechte auf Bit-Ebene verwalten? Der Nachteil daran ist, dass du sie umständlich über Bit-Operationen wieder auseinandernehmen musst. Das Konzept stammt aus einer zeit, als Speicher noch ziemlich teuer war und man damit haushalten musste. Es ist einfacher, du nimmst ein Array mit den drei Werten. Alternativ kannst du auch eine einfache Klasse erstellen. Die kannst du bei Bedarf sogar noch beliebig erweitern.

    dedlfix.

    1. Das so anzugehen, halte ich für keine besonders gute Idee. Warum willst du die Rechte auf Bit-Ebene verwalten? Der Nachteil daran ist, dass du sie umständlich über Bit-Operationen wieder auseinandernehmen musst. Das Konzept stammt aus einer zeit, als Speicher noch ziemlich teuer war und man damit haushalten musste. Es ist einfacher, du nimmst ein Array mit den drei Werten. Alternativ kannst du auch eine einfache Klasse erstellen. Die kannst du bei Bedarf sogar noch beliebig erweitern.

      Ich finde eine eigene Klasse ist komplizierter als die Bit-Operatoren (wenn es denn so funktioniert wie in meiner Antwort an Der Martin). Es wäre damit auch nicht schwer ein "CRUD"-Konstrukt aufzuziehen oder es beliebig zu erweitern indem man einfach noch Bits anhängt.

      Die Rechte als Integer haben, oberflächlich betrachtet, auch erstmal den Vorteil, dass ich ihn in 1 Spalte einer Tabelle ablegen kann. So muss ich die Tabelle nicht erweitern wenn ich die Rechte erweitern will.

      Oder denke ich hier in die falsche Richtung?

      1. Tach!

        Es ist einfacher, du nimmst ein Array mit den drei Werten. Alternativ kannst du auch eine einfache Klasse erstellen. Die kannst du bei Bedarf sogar noch beliebig erweitern.
        Ich finde eine eigene Klasse ist komplizierter als die Bit-Operatoren

        Eine Klasse wäre in erster Linie lediglich zum Zusammenfassen der Daten da. Sie bekommt drei Boolean-Eigenschaften und einen Konstruktor, mit dem man alle drei gleichzeitig setzen kann. Lesender und schreibender Zugriff erfolgt direkt über diese drei Eigenschaften.

        Die Rechte als Integer haben, oberflächlich betrachtet, auch erstmal den Vorteil, dass ich ihn in 1 Spalte einer Tabelle ablegen kann. So muss ich die Tabelle nicht erweitern wenn ich die Rechte erweitern will.

        Mit MySQLs/MariaDBs Datentyp SET braucht es auch nur ein Feld (Auch VARCHAR statt SET wäre denkbar). Du kannst die Klasse erweitern, zum Beispiel mit __toString(), um die gesetzten Werte kommasepariert zurückzuliefern. Der Konstruktur könnte unterscheiden, ob er einen oder drei Parameter bekommt. Bei nur einem parst er den Inhalt und verteilt ihn auf die drei Eigenschaften.

        dedlfix.