Was macht dieses bitweise ODER in diesem seltsamen Array-Schlüsselkonstrukt?

Lesezeit: 4 Minuten

Kann mir jemand erklären was das bedeutet?? Ich habe dieses Konstrukt noch nie gesehen – aus der genommen Prestashop-Dokument

foreach ( $languages as $language )
{
  echo '<div id="test_' . $language['id_lang'|'id_lang'] .... // <-- What the??
  // ... 
}

$language enthält die folgenden Schlüssel:

Array
(
    [id_lang] => 1
    [name] => English (English)
    // and others... 
)

Das Ergebnis ist, dass es den Wert von $language annimmt[“id_lang”] – 1. Aber ich verstehe die Syntax nicht und kann keine Dokumentation darüber finden.

  • 'id_lang'|'id_lang' === 'id_lang'also bin ich mir nicht sicher, warum sie das tun …

    – Rich Bradshaw

    19. November 2012 um 10:54 Uhr

  • Oh Prestashop, du bist so dumm …

    – Unerschrocken

    19. November 2012 um 11:11 Uhr

  • Sie alle hatten die gleiche Antwort, was meinen Verdacht bestätigte. Danke – ich gebe Botond Punkte dafür, dass er mein neues Lieblingswort gefunden hat – „Idempotenz“ – und weil er die Wiederholungspunkte mehr brauchte.

    – Liebling

    19. November 2012 um 11:17 Uhr

  • Vielleicht gab es ursprünglich auf beiden Seiten unterschiedliche Dinge | die waren aus einem Grund da, und dann wurde man geändert id_langund der Wechsler bemerkte nicht, dass der andere auch diesen Wert hatte.

    – ACarter

    19. November 2012 um 19:00 Uhr

  • Jeder erklärte, dass dies eine sinnlose Operation ist und dass der Autor (oder gegebenenfalls der Umschreiber) keine Ahnung hat, was er tat. Aber niemand hat eine Theorie, wie das passieren konnte? Ich bin fasziniert. Ich verbrachte eine Weile damit, darüber nachzudenken, wie genau diese Konstruktion hätte entstehen können, und keine der Ideen, die ich hatte, schien plausibel.

    – Ben Lee

    20. November 2012 um 22:03 Uhr

Benutzer-Avatar
Botond Balázs

Dies php -a Sitzung zeigt, dass es völlig bedeutungslos ist:

php > $value="something"|'something';
php > echo $value;
something
php > $arr = array('abc' => 1, 'def' => 2);
php > echo $arr['abc'|'abc'];
1
php > echo $arr['def'|'def'];
2

Grundsätzlich erhalten Sie den ursprünglichen Wert, wenn Sie etwas “bitweise oder” selbst verwenden. Diese Eigenschaft wird aufgerufen Idempotenz in Mathematik. Für weitere Informationen lesen Sie:

Ehrlich gesagt hatte der ursprüngliche Autor dieses Codes keine Ahnung, was er tat.

  • Danke für die Recherche. Ich mag eher den Klang von “Idempotenz” – er scheint zu dem Konstrukt zu passen.

    – Liebling

    19. November 2012 um 11:13 Uhr

  • Ich mag es auch. Eines meiner nutzlosen Lieblingswörter, die ich im College gelernt habe 🙂

    – Botond Balázs

    19. November 2012 um 11:15 Uhr

  • Zitat von php.net (php.net/manual/en/language.operators.bitwise.php): Achten Sie auf Datentypkonvertierungen. Wenn sowohl der linke als auch der rechte Parameter Zeichenfolgen sind, arbeitet der bitweise Operator mit den ASCII-Werten der Zeichen.

    – Eisberg

    19. November 2012 um 14:05 Uhr

  • @GradyPlayer Nein, das kannst du nicht, zumindest nicht zuverlässig. Unterschiedliche Codierungen verwenden unterschiedliche Anzahlen von Bytes für ein Zeichen, je nachdem, wie viele Codepunkte die Codierung hat. Wenn Sie ein bitweises oder ein 4-Byte-codiertes Zeichen und ein 1-Byte-codiertes Zeichen ausführen, wird möglicherweise dasselbe Zeichen zurückgegeben, wenn das erste Byte übereinstimmt, aber das bedeutet nicht unbedingt, dass sie dieselbe Codierung haben.

    – Asad Saeeduddin

    19. November 2012 um 20:35 Uhr

  • @GradyPlayer Es gibt eine unterschiedliche Anzahl von Bits (das sind die Binärdaten). Die kleinste Anzahl von Bits wird bearbeitet, aber diese Übereinstimmung einfach zu haben, ist keine Garantie dafür, dass die restlichen Bits identisch sind.

    – Asad Saeeduddin

    19. November 2012 um 21:02 Uhr

Benutzer-Avatar
Asad Saeeduddin

Was das tut, ist die Verwendung des bitweisen Operators für die ASCII-Werte der Zeichen in der Zeichenfolge “id_lang”, obwohl mir der Grund dafür ein Rätsel ist, da das Ergebnis immer dasselbe sein wird.

Nehmen wir zur Vereinfachung an, dass wir ASCII verwenden, wobei jedes Zeichen als einzelnes Byte codiert wird. Schauen wir uns an, was passiert, wenn es den Vergleich für die binäre Darstellung des ersten Zeichens (i is 105was binär ist 01101001):

   "i": 01101001
OR "i": 01101001
      ___________
      = 01101001
      = "i"

0|0 ist 0, 1|1 ist 1, also bleiben zwangsläufig alle Bits unverändert.

  • Um es etwas pedantischer zu machen: es ist ein bitweises Oder-ing der Byte-Werte der Zeichenfolge, die davon abhängt, wie sie codiert ist. Ja, in der Praxis werden das so ziemlich die “ASCII-Werte” sein … 🙂

    – verzeihen

    19. November 2012 um 10:59 Uhr

  • @deceze Wäre das nicht so Bit-Werte? Oder verstehe ich etwas falsch?

    – Asad Saeeduddin

    19. November 2012 um 13:07 Uhr

  • Dasselbe, wirklich. 1 Byte sind 8 Bit, und ASCII-Zeichen werden normalerweise als Bytewerte ausgedrückt …

    – verzeihen

    19. November 2012 um 13:19 Uhr

Seltsamerweise tut es nichts.

var_dump('id_lang'|'id_lang');
#=> string(7) "id_lang"

http://ideone.com/zXdRMO

Selbst wenn es war Wenn ich etwas mache, fühlt sich die Verwendung eines bitweisen Operators für einen stringbasierten Array-Schlüssel für mich sicherlich wie Code-Geruch an.

1228220cookie-checkWas macht dieses bitweise ODER in diesem seltsamen Array-Schlüsselkonstrukt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy