tag:forum.selfhtml.org,2005:/self Zeichen in String eins höher zählen funktioniert nicht. Warum? – SELFHTML-Forum 2020-12-17T20:42:51Z https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779253#m1779253 Klaus1 2020-12-17T07:48:14Z 2020-12-17T07:48:14Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo,</p> <p>ich bin schon fast am Verzweifeln...</p> <p>In dem String "QMF 71328_C Test" möchte ich aus dem "C" ein "D" machen und dann in eine MySQL-Tabelle speichern.</p> <p>Mein erster Versuch war:</p> <pre><code class="block">$string = "QMF 71328_C Test"; $rev = substr($string,10,1); $next_rev = ++$rev; $string[10] = $next_rev; $sql = "update tabelle set titel = '$string' where id = '123'"; </code></pre> <p>In der Tabelle wird aber "Array" gespeichert. Nächster Versuch mit <code>$string = strval($string);</code> machte keinen Unterschied. Neuer Versuch mit</p> <pre><code class="block">$string = substr_replace($string,$next_rev,10,1); </code></pre> <p>schreibt jetzt einen Leerstring in die Tabelle.</p> <p>Wenn ich den Code in einer Sandbox teste, funktioniert alles einwandfrei.</p> <p>Wo ist denn bloß mein Fehler?</p> <p>LG Klaus</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779255#m1779255 Klaus1 2020-12-17T08:17:06Z 2020-12-17T08:17:06Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo,</p> <p>hat sich erledigt. Ich habe den Fehler gefunden. Er lag (natürlich) nicht an dem Code zum Hochzählen des Index, sondern vorher schon an der Ermittlung des Strings.</p> <p>Danke trotzdem.</p> <p>LG Klaus</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779258#m1779258 Raketentheo 2020-12-17T12:19:58Z 2020-12-17T12:19:58Z Fehler auf Level 9 <blockquote> <p>ich bin schon fast am Verzweifeln...</p> </blockquote> <p>Das wirst Du bals wieder sein - oder jemand anderes.</p> <blockquote> <p>In dem String "QMF 71328_C Test" möchte ich aus dem "C" ein "D" machen und dann in eine MySQL-Tabelle speichern.</p> <p>Mein erster Versuch war:</p> <pre><code class="block">$string = "QMF 71328_C Test"; $rev = substr($string,10,1); $next_rev = ++$rev; $string[10] = $next_rev; $sql = "update tabelle set titel = '$string' where id = '123'"; </code></pre> </blockquote> <p>Offensichtlich willst Du einfach das nächste Zeichen der ASCII-Tabelle nehmen. Das gänge als Einzeiler.</p> <pre><code class="block bad language-php"><span class="token variable">$string</span><span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">chr</span><span class="token punctuation">(</span> <span class="token number">1</span> <span class="token operator">+</span> <span class="token function">ord</span><span class="token punctuation">(</span> <span class="token variable">$string</span><span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Ich markiere das als „schlechten Code“, denn die ganze Methode bereitet mir Kopfschmerzen, die hat keine Zukunft:</p> <pre><code class="block bad language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment"># Nicht nachmachen!</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"QMF 71328_C Test"</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$string</span><span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">chr</span><span class="token punctuation">(</span> <span class="token number">1</span> <span class="token operator">+</span> <span class="token function">ord</span><span class="token punctuation">(</span> <span class="token variable">$string</span><span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$string</span><span class="token operator">.</span><span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>Ergebnisse (Auswahl)</p> <pre><code class="block">… 0 : QMF 71328_D Test 1 : QMF 71328_E Test 2 : QMF 71328_F Test … 22 : QMF 71328_Z Test 23 : QMF 71328_[ Test 24 : QMF 71328_\ Test … 29 : QMF 71328_a Test 30 : QMF 71328_b Test 31 : QMF 71328_c Test … 54 : QMF 71328_z Test 55 : QMF 71328_{ Test … 60 : QMF 71328_� Test 61 : QMF 71328_� Test … 188 : QMF 71328_ Test 189 : QMF 71328_ Test 190 : QMF 71328_ Test 191 : QMF 71328_ Test 192 : QMF 71328_ Test 193 : QMF 71328_ Test 194 : QMF 71328_ Test 195 : QMF 71328_ Test 196 : QMF 71328 Test 197 : QMF 71328_ Test 198 : QMF 71328_ Test 199 : QMF 71328_ Test 200 : QMF 71328_ Test Test QMF 71328_ … 221 : QMF 71328_! Test 222 : QMF 71328_" Test … 236 : QMF 71328_0 Test 237 : QMF 71328_1 Test … 245 : QMF 71328_9 Test 246 : QMF 71328_: Test 247 : QMF 71328_; Test … 252 : QMF 71328_@ Test 253 : QMF 71328_A Test 254 : QMF 71328_B Test 255 : QMF 71328_C Test 256 : QMF 71328_D Test … </code></pre> <p>DAS wirst Du nicht wollen, Dein Auftraggeber wohl auch nicht. Bevor das aufscheinende Problem aus Sicht des Programmierers gelöst werden kann muss es eine bessere Vorschrift</p> <ol> <li>für den Aufbau des Strings und</li> <li>für die Ermittlung des Kennzeichens der "neuen Version" (Bei Dir war das "C"→"D") geben.</li> </ol> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779273#m1779273 Rolf B 2020-12-17T15:12:31Z 2020-12-17T15:12:31Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo,</p> <p>TIL: PHP kann Strings inkrementieren .</p> <p>Und wiedermal erweist sich: PHP kann alles, aber nichts richtig.</p> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"123_Z"</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"123Z"</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"Z"</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$a</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$c</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$a</span></span> \n"</span><span class="token punctuation">;</span> <span class="token comment">// 123_A</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$b</span></span> \n"</span><span class="token punctuation">;</span> <span class="token comment">// 124A</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$c</span></span> \n"</span><span class="token punctuation">;</span> <span class="token comment">// AA</span> </code></pre> <p>Man kann für jede einzelne der gezeigten Verhaltenweisen gute Gründe finden, aber jede Ausnahme mehr, die man beachten muss, macht es chaotischer.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779259#m1779259 Raketentheo 2020-12-17T12:32:39Z 2020-12-17T12:32:39Z Begriffserklärung: Level 9 <p><a href="https://de.wikipedia.org/wiki/Layer_8" rel="nofollow noopener noreferrer">Level 9</a></p> <p>Zitat:</p> <blockquote> <p>In diesem Zusammenhang nutzen der Kryptoexperte Bruce Schneier und die Netzwerksicherheitsfirma RSA den Begriff. In einem Kommentar im RSA-Blog vom 7. Dezember 2010 erweiterte der Gastautor Ian Farquhar das Netzwerkmodell um Layer 8 und noch zwei weitere Layer.</p> </blockquote> <blockquote> <p>Das gesamte erweiterte OSI-Modell sieht dann wie folgt aus:</p> </blockquote> <blockquote> <ul> <li>Layer 8: das Individuum (Human Layer)</li> <li><strong>Layer 9: die Organisation (Organization Layer)</strong></li> <li>Layer 10: der Staat (Legal and External Compliance Layer)</li> </ul> </blockquote> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779260#m1779260 Tabellenkalk 2020-12-17T12:33:57Z 2020-12-17T12:33:57Z Fehler auf Level 9 <p>Hallo,</p> <blockquote> <p>Ich markiere das als „schlechten Code“, denn die ganze Methode bereitet mir Kopfschmerzen, die hat keine Zukunft:</p> </blockquote> <p>Gut, dass du deinen eigenen Code so markierst. Möglicherweise hat Klaus mit Absicht den <a href="https://www.php.net/manual/de/language.operators.increment.php" rel="nofollow noopener noreferrer">Increment-Operator</a> verwendet, der die aufgezeigten Probleme offenbar nicht hat.</p> <blockquote> <p>Bevor das aufscheinende Problem aus Sicht des Programmierers gelöst werden kann muss es eine bessere Vorschrift</p> <ol> <li>für den Aufbau des Strings und</li> <li>für die Ermittlung des Kennzeichens der "neuen Version" (Bei Dir war das "C"→"D") geben.</li> </ol> </blockquote> <p>Das ist natürlich sinnvoll.</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779261#m1779261 Raketentheo 2020-12-17T12:42:22Z 2020-12-17T12:42:22Z Fehler auf Level 9 <blockquote> <p>. Möglicherweise hat Klaus mit Absicht den Increment-Operator verwendet, der die aufgezeigten Probleme offenbar nicht hat.</p> </blockquote> <p>Mag sein. Aber eine echte Verbesserung tritt nicht ein, bzw. bleibt es bei minestens der aufgezeigten Probleme:</p> <pre><code class="block bad language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"QMF 71328_C Test"</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">257</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$rev</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$string</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$next_rev</span> <span class="token operator">=</span> <span class="token operator">++</span><span class="token variable">$rev</span><span class="token punctuation">;</span> <span class="token variable">$string</span><span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$next_rev</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$i</span></span> : <span class="token interpolation"><span class="token variable">$string</span></span>"</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <pre><code class="block">0 : QMF 71328_D Test 1 : QMF 71328_E Test … 23 : QMF 71328_A Test 24 : QMF 71328_B Test 25 : QMF 71328_C Test 26 : QMF 71328_D Test … 48 : QMF 71328_Z Test 49 : QMF 71328_A Test 50 : QMF 71328_B Test 51 : QMF 71328_C Test 52 : QMF 71328_D Test 53 : QMF 71328_E Test … </code></pre> <p>Aus gutem Grund nehme ich nämlich an, dass die Versionisierung ein[ein]deutig sein soll.</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779264#m1779264 Raketentheo 2020-12-17T12:58:38Z 2020-12-17T12:58:38Z Fehler auf Level 9 <p>Eine mögliche Lösung könnte dann so aussehen:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"QMF 71328_C Test"</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">257</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">list</span><span class="token punctuation">(</span> <span class="token variable">$p1</span><span class="token punctuation">,</span> <span class="token variable">$p2</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'_'</span><span class="token punctuation">,</span> <span class="token variable">$string</span><span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">list</span><span class="token punctuation">(</span> <span class="token variable">$p2</span><span class="token punctuation">,</span> <span class="token variable">$p3</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token variable">$p2</span><span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$next_p2</span> <span class="token operator">=</span> <span class="token operator">++</span><span class="token variable">$p2</span><span class="token punctuation">;</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token variable">$p1</span><span class="token operator">.</span><span class="token string single-quoted-string">'_'</span><span class="token operator">.</span><span class="token variable">$next_p2</span><span class="token operator">.</span><span class="token string single-quoted-string">' '</span><span class="token operator">.</span><span class="token variable">$p3</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$i</span></span> : <span class="token interpolation"><span class="token variable">$string</span></span>"</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>Ausgaben:</p> <pre><code class="block">… 22 : QMF 71328_Z Test 23 : QMF 71328_AA Test … 48 : QMF 71328_AZ Test 49 : QMF 71328_BA Test … </code></pre> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779274#m1779274 Rolf B 2020-12-17T15:19:37Z 2020-12-17T15:19:37Z Fehler auf Level 9 <p>Hallo Raketentheo,</p> <p>ich hatte gedacht, mit preg_replace_callback könnte es einfacher sein, aber ist es das wirklich? </p> <pre><code class="block language-php"><span class="token variable">$string</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"QMF 71328_X Test"</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$i</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator"><</span><span class="token number">10</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token function">preg_replace_callback</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"/_(.*?) /"</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token variable">$treffer</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string double-quoted-string">"_"</span> <span class="token operator">.</span> <span class="token operator">++</span><span class="token variable">$treffer</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">" "</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token variable">$string</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$i</span></span> - nächster Schritt ist <span class="token interpolation"><span class="token variable">$string</span></span> \n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779284#m1779284 Inkrementieren und krude Zahlensysteme 2020-12-17T16:20:17Z 2020-12-17T16:20:17Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <pre><code class="block">"123_Z" -> "123_A" (erwartet hätte ich "123_AA") "123Z" -> "124A" (erwartet hätte ich "123AA") </code></pre> <p>... "geht gar nicht". Aus dem Grund ist das Inkrementieren von Strings in PHP nicht das, was ich empfehlen würde.</p> <p>Da fällt mir aber ein, <a href="https://code.fastix.org/Projekte/PHP%3AUmrechnung%20zwischen%20Zahlensystemen/" rel="nofollow noopener noreferrer">ich habe vor Jahren mal was zu kruden Zahlensystemen implementiert</a>.</p> <pre><code class="block"><?PHP $NS = new numberSystem('ABCDEFGHIJKLMNOPQRSTUVWXYZ'); $s='A'; echo $s . PHP_EOL; for($i=0; $i<100; $i++) { $s = $NS->getString( 1 + $NS->getDec( $s ) ); echo $s . PHP_EOL; } class numberSystem { protected $arChars = false; protected $hash = false; function __construct($var='niceReadable32') { switch (true) { case ( is_array($var) ): return setChars( $var ); case ( 'bin' == $var || 'binär' == $var ): $this -> setChars ( array('0','1') ); break; case ( 'alphabet' == $var || 'alpha' == $var ): $this -> setChars ('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); break; case ( 'ascii_33_126' == $var || 'ascii_visible' == $var ): $ar = array(); for ($i=33; $i<127; $i++) { $ar[] = chr($i); } $this -> setChars($ar); break; case( 'niceReadable32' == $var ): $this -> setChars ( array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z') ); break; case( 'decObusfacted' == $var || 'wuerfel' == $var ): $this -> setChars ( array('0','9','8','7','1','2','3','5','4','6') ); break; default: $this -> setChars ( $var ); break; } return true; } public function getChars() { return $this -> arChars; } public function getHash() { return $this -> hash; } public function setChars($arr) { if (! is_array( $arr ) ) { $arr = preg_split('//u', $arr, -1, PREG_SPLIT_NO_EMPTY); } if (2 <= count($arr) ) { $test = array_unique($arr); if ( $test == $arr) { $this -> arChars = $arr; $this -> hash = $this -> mkHash($arr); return count($arr); } else { trigger_error ( 'class: numberSystem, function: setChars :: Der übergebene Array ist nicht unique', E_USER_ERROR ); } } else { trigger_error ( 'class: numberSystem, function: setChars :: Es wurde kein Array übergeben oder der Array hat weniger als zwei Elemente', E_USER_ERROR ); } return false; } private function mkHash( $arr ) { $i=0; foreach ( $arr as $element ) { $hash[$element] = $i++; } return $hash; } public function getDec( $str ) { $number = 0; $length = strlen($str); for ( $i = $length; $i > 0; $i-- ) { $inv = $length - ( $i ); $char = $str[( $i-1 )]; if ( ! isset ( $this -> hash[$char] ) ) { trigger_error ( 'class: numberSystem, function: getNumberFromString :: Das Zeichen "'.$char.'" ist in der verwendeten Symboltabelle nicht enthalten', E_USER_ERROR ); return false; } $number = $number + pow( count($this -> hash), $inv ) * ( $this -> hash[$char] ); } return $number; } function getString( $int ) { # gibt die Zahl aus dem beliebigen Zahlensystem (String) zurück if ( $int > PHP_INT_MAX ) { trigger_error ( 'class: numberSystem, function: getString :: Es wurde eine zu große Zahl ('.$int.') übergeben. Maximum ist '. PHP_INT_MAX , E_USER_ERROR ); } if ( 0 == $int ) { return $this -> arChars[$int]; } $length = count($this -> arChars); $str = ''; $positions = 0; while ( pow( $length, $positions ) <= $int ) { $positions++; } for ($i = $positions; $i > 0; $i-- ) { $potenz = pow( $length, $i-1 ); $pos = floor( $int / $potenz ); $int = $int % $potenz; $str = $str . $this -> arChars[$pos]; } return $str; } } </code></pre> <p>... läuft noch mit PHP 8.0 -)</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779291#m1779291 Der Martin 2020-12-17T16:40:42Z 2020-12-17T16:40:42Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Rolf,</p> <blockquote> <p>TIL: PHP kann Strings inkrementieren .</p> </blockquote> <p>ich wusste das auch noch nicht, und halte dieses "Feature" für höchst fragwürdig.</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"123_Z"</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"123Z"</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"Z"</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$a</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$c</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$a</span></span> \n"</span><span class="token punctuation">;</span> <span class="token comment">// 123_A</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$b</span></span> \n"</span><span class="token punctuation">;</span> <span class="token comment">// 124A</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$c</span></span> \n"</span><span class="token punctuation">;</span> <span class="token comment">// AA</span> </code></pre> </blockquote> <p>Die Logik dahinter erschließt sich mir nicht. Versucht PHP tatsächlich, die semantische Bedeutung eines Strings zu erraten und das basierend auf dieser Semantik zu incrementieren?<br> Aber selbst wenn, dann geht das erste Beispiel doch komplett in die Binsen. Nach welcher Logik ist "123_A" der Nachfolger von "123_Z"?</p> <p>Und was ist hiermit:</p> <pre><code class="block language-php"><span class="token variable">$s</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"March"</span><span class="token punctuation">;</span> <span class="token variable">$s</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$s</span><span class="token punctuation">;</span> </code></pre> <p>Wird hier etwa "April" ausgegeben? Wäre ja irgendwie logisch.<br> Ich habe auf die Schnelle kein PHP zur Hand, sonst würde ich es ausprobieren.</p> <blockquote> <p>Man kann für jede einzelne der gezeigten Verhaltenweisen gute Gründe finden</p> </blockquote> <p>Echt? Versuch's mal. Vor allem für den ersten Fall bin ich ratlos.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden. </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779278#m1779278 Raketentheo 2020-12-17T15:39:52Z 2020-12-17T15:39:52Z Fehler auf Level 9 <blockquote> <p>aber ist es das wirklich? </p> </blockquote> <p>Kommt drauf an, für wen und für was. </p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779297#m1779297 Tabellenkalk 2020-12-17T16:59:28Z 2020-12-17T16:59:28Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo,</p> <blockquote> <p>Und was ist hiermit:</p> <pre><code class="block language-php"><span class="token variable">$s</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"March"</span><span class="token punctuation">;</span> <span class="token variable">$s</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$s</span><span class="token punctuation">;</span> </code></pre> <p>Wird hier etwa "April" ausgegeben? Wäre ja irgendwie logisch.<br> Ich habe auf die Schnelle kein PHP zur Hand, sonst würde ich es ausprobieren.</p> </blockquote> <p>Mein PHP antwortet mit "Marci"...</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779304#m1779304 Rolf B 2020-12-17T17:52:37Z 2020-12-17T17:52:37Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Martin,</p> <p>ja, Marci. Ist doch logisch ;)</p> <p>Ich identifiziere folgende Regeln (und übersehe vermutlich Ausnahmen):</p> <ol> <li>Sei <code>$string</code> die zu inkrementierende Zeichenkette.</li> <li>Setze <code>$p</code> auf <code>LEN($string)-1</code>.</li> <li>Ist <code>$p == -1</code>, beende die Operation mit <code>"1"</code> als Ergebnis.</li> <li>Setze <code>$c</code> auf <code>$string[$p]</code></li> <li>Ist <code>$c</code> ein Match für <code>/[0-8A-Ya-y]/</code>, inkrementiere seinen Zeichencode um 1, schreibe <code>$c</code> nach <code>$string[$p]</code> und beende die Operation mit <code>$string</code> als Ergebnis.</li> <li>Ist <code>$c == "9"</code>, setze <code>$c</code> auf <code>"0"</code></li> <li>Ist <code>$c == "Z"</code>, setze <code>$c</code> auf <code>"A"</code></li> <li>Ist <code>$c == "z"</code>, setze <code>$c</code> auf <code>"a"</code></li> <li>Schreibe <code>$c</code> nach <code>$string[$p]</code></li> <li>Setze <code>$p</code> auf <code>$p - 1</code>. Solange <code>$p</code> nicht negativ ist, setze bei 4. fort.</li> <li>Ist <code>$c == "a"</code> oder <code>$c == "A"</code>, setze <code>$string</code> auf <code>$c . $string</code>. Andernfalls setze <code>$string</code> auf <code>"1" . $string</code>.</li> <li>Beende die Operation.</li> </ol> <p>Testfragen: Nenne die Nachfolger von "19Z", "1Z99", "zzz", "zzZ" und "Zzz".</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779298#m1779298 Der Martin 2020-12-17T17:20:25Z 2020-12-17T17:20:25Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hi,</p> <blockquote> <blockquote> <p>Und was ist hiermit:</p> <pre><code class="block language-php"><span class="token variable">$s</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"March"</span><span class="token punctuation">;</span> <span class="token variable">$s</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$s</span><span class="token punctuation">;</span> </code></pre> <p>Wird hier etwa "April" ausgegeben? Wäre ja irgendwie logisch.<br> Ich habe auf die Schnelle kein PHP zur Hand, sonst würde ich es ausprobieren.</p> </blockquote> <p>Mein PHP antwortet mit "Marci"...</p> </blockquote> <p>okay, das ist, was ich ohne diese ganze Magie erwartet hätte: Der Code des letzten Zeichens im String wird incrementiert, bei einem Überlauf dann auch das vorletzte, und so weiter.</p> <p>Trotzdem: Ich halte den Increment- oder Decrement-Operator im Zusammenhang mit Strings für "Mumpity"++.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden. </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779299#m1779299 Tabellenkalk 2020-12-17T17:23:05Z 2020-12-17T17:23:05Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo,</p> <blockquote> <p>"Mumpity"++.</p> </blockquote> <p>wenn nicht sogar "Mumpitx"+++</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779305#m1779305 Rolf B 2020-12-17T17:55:42Z 2020-12-17T17:55:42Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Martin,</p> <blockquote> <p>Ich halte den Increment- oder Decrement-Operator im Zusammenhang mit Strings für "Mumpity"++.</p> </blockquote> <p>MMD </p> <p>Decrement ist für gemischte Strings übrigens nicht definiert.</p> <p>"Z99" kann man nicht dekrementieren. "99" dagegen schon. Argh!</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779321#m1779321 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-12-17T20:22:17Z 2020-12-17T20:22:17Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Der Martin,</p> <blockquote> <p>Trotzdem: Ich halte den Increment- oder Decrement-Operator im Zusammenhang mit Strings für "Mumpity"++.</p> </blockquote> <p>Müsste es nicht ++"Mumpity" heißen?</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779313#m1779313 JürgenB https://www.j-berkemeier.de 2020-12-17T18:33:05Z 2020-12-17T18:33:05Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Rolf,</p> <p>da frage ich mich schon: „Was haben die geraucht?“</p> <p>Gruß<br> Jürgen</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779308#m1779308 Der Martin 2020-12-17T18:00:56Z 2020-12-17T18:00:56Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>n'Abend,</p> <blockquote> <blockquote> <p>Ich halte den Increment- oder Decrement-Operator im Zusammenhang mit Strings für "Mumpity"++.</p> </blockquote> <p>MMD </p> </blockquote> <p>graag gedaan. </p> <blockquote> <p>Decrement ist für gemischte Strings übrigens nicht definiert.</p> <p>"Z99" kann man nicht dekrementieren. "99" dagegen schon. Argh!</p> </blockquote> <p>Wunderbar logisch und konsequent. PHP ist echt immer für Überraschungen gut!<br> Ich liebe es wie Apfelmus, von dem ich leider kotzen muss<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden. </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Nein, nicht wirklich. Aber der Spruch passt gerade so gut hierher. <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779309#m1779309 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-12-17T18:17:01Z 2020-12-17T18:17:01Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Rolf B,</p> <blockquote> <p>MMD </p> </blockquote> <p><code>inc(MMD) = MMDI</code>.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779311#m1779311 Tabellenkalk 2020-12-17T18:22:17Z 2020-12-17T18:22:17Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo,</p> <blockquote> <blockquote> <p>MMD </p> </blockquote> <p><code>inc(MMD) = MMDI</code>.</p> </blockquote> <p>2501? Kann PHP jetzt auch römisch zählen?</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779317#m1779317 Rolf B 2020-12-17T18:57:19Z 2020-12-17T18:57:19Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Matthias,</p> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"MMD"</span><span class="token punctuation">;</span> <span class="token variable">$a</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$a</span><span class="token punctuation">;</span> </code></pre> <pre><code class="block">MME </code></pre> <p>leider nicht. Das war wohl selbst R.L. zu viel der Obskurität ⚔️</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779312#m1779312 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-12-17T18:23:58Z 2020-12-17T18:23:58Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Tabellenkalk,</p> <blockquote> <blockquote> <blockquote> <p>MMD </p> </blockquote> <p><code>inc(MMD) = MMDI</code>.</p> </blockquote> <p>2501? Kann PHP jetzt auch römisch zählen?</p> </blockquote> <p>Ja. Keine Ahnung. Ich kann.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779314#m1779314 MudGuard http://www.andreas-waechter.de/ 2020-12-17T18:36:31Z 2020-12-17T18:36:31Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hi,</p> <blockquote> <p>da frage ich mich schon: „Was haben die geraucht?“</p> </blockquote> <p>Metham<em><strong>php</strong></em>etamin.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779315#m1779315 Der Martin 2020-12-17T18:41:37Z 2020-12-17T18:41:37Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Jürgen,</p> <blockquote> <p>da frage ich mich schon: „Was haben die geraucht?“</p> </blockquote> <p>spannende Frage. Ich glaube, das möchte ich auch mal probieren. <br> Wer weiß, was ich dann für hirnrissig-geniale Ideen habe.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden. </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779322#m1779322 Rolf B 2020-12-17T20:30:16Z 2020-12-17T20:30:27Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>Hallo Matthias,</p> <blockquote> <p>Müsste es nicht ++"Mumpity" heißen?</p> </blockquote> <p>Auf keinen Fall. Es muss</p> <pre><code class="block language-php"> <span class="token variable">$unsinn</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"Mumpity"</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$unsinn</span><span class="token punctuation">;</span> </code></pre> <p>heißen, weil man Literale nicht inkrementieren kann </p> <p>Ob das ++ davor oder dahinter kommen muss, oder ob das überhaupt relevant ist, hängt vom Kontext ab. Weißt Du aber sicherlich.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779324#m1779324 Der Martin 2020-12-17T20:42:51Z 2020-12-17T20:42:51Z Zeichen in String eins höher zählen funktioniert nicht. Warum? <p>n'Abend Matthias,</p> <blockquote> <blockquote> <p>Trotzdem: Ich halte den Increment- oder Decrement-Operator im Zusammenhang mit Strings für "Mumpity"++.</p> </blockquote> <p>Müsste es nicht ++"Mumpity" heißen?</p> </blockquote> <p>das ist egal, solange der Ausdruck nicht selbst Teil eines übergeordneten Ausdrucks ist. Denn ++$x bedeutet: Erhöhe $x um eins, schreibe den Wert zurück und liefere den so erhaltenen Wert als Ergebnis (Pro-Increment), während $x++ bedeutet: Merk dir den Wert von $x als Ergebnis vor, erhöhe ihn um 1 und schreibe ihn zurück (Post-Increment).</p> <p>Aber Rolf hat natürlich auch Recht: Der Increment- oder Decrement-Operator braucht als Operanden ein LValue, also einen Ausdruck, der links von einem Zuweisungszeichen stehen kann. Oder anders gesagt: Ein Ausdruck, der einen Speicherplatz repräsentiert.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden. </div>