tag:forum.selfhtml.org,2005:/selfZeichen in String eins höher zählen funktioniert nicht. Warum? – SELFHTML-Forum2020-12-17T20:42:51Zhttps://forum.selfhtml.org/self/2020/dec/17/zeichen-in-string-eins-hoher-zahlen-funktioniert-nicht-warum/1779253#m1779253Klaus12020-12-17T07:48:14Z2020-12-17T07:48:14ZZeichen 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#m1779255Klaus12020-12-17T08:17:06Z2020-12-17T08:17:06ZZeichen 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#m1779258Raketentheo2020-12-17T12:19:58Z2020-12-17T12:19:58ZFehler 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#m1779273Rolf B2020-12-17T15:12:31Z2020-12-17T15:12:31ZZeichen 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#m1779259Raketentheo2020-12-17T12:32:39Z2020-12-17T12:32:39ZBegriffserklä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#m1779260Tabellenkalk2020-12-17T12:33:57Z2020-12-17T12:33:57ZFehler 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#m1779261Raketentheo2020-12-17T12:42:22Z2020-12-17T12:42:22ZFehler 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#m1779264Raketentheo2020-12-17T12:58:38Z2020-12-17T12:58:38ZFehler 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#m1779274Rolf B2020-12-17T15:19:37Z2020-12-17T15:19:37ZFehler 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#m1779284Inkrementieren und krude Zahlensysteme2020-12-17T16:20:17Z2020-12-17T16:20:17ZZeichen 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#m1779291Der Martin2020-12-17T16:40:42Z2020-12-17T16:40:42ZZeichen 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#m1779278Raketentheo2020-12-17T15:39:52Z2020-12-17T15:39:52ZFehler 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#m1779297Tabellenkalk2020-12-17T16:59:28Z2020-12-17T16:59:28ZZeichen 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#m1779304Rolf B2020-12-17T17:52:37Z2020-12-17T17:52:37ZZeichen 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#m1779298Der Martin2020-12-17T17:20:25Z2020-12-17T17:20:25ZZeichen 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#m1779299Tabellenkalk2020-12-17T17:23:05Z2020-12-17T17:23:05ZZeichen 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#m1779305Rolf B2020-12-17T17:55:42Z2020-12-17T17:55:42ZZeichen 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#m1779321Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2020-12-17T20:22:17Z2020-12-17T20:22:17ZZeichen 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#m1779313JürgenBhttps://www.j-berkemeier.de2020-12-17T18:33:05Z2020-12-17T18:33:05ZZeichen 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#m1779308Der Martin2020-12-17T18:00:56Z2020-12-17T18:00:56ZZeichen 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#m1779309Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2020-12-17T18:17:01Z2020-12-17T18:17:01ZZeichen 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#m1779311Tabellenkalk2020-12-17T18:22:17Z2020-12-17T18:22:17ZZeichen 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#m1779317Rolf B2020-12-17T18:57:19Z2020-12-17T18:57:19ZZeichen 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#m1779312Matthias Apselmatthias.apsel@selfhtml.orghttps://brückentage.info2020-12-17T18:23:58Z2020-12-17T18:23:58ZZeichen 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#m1779314MudGuardhttp://www.andreas-waechter.de/2020-12-17T18:36:31Z2020-12-17T18:36:31ZZeichen 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#m1779315Der Martin2020-12-17T18:41:37Z2020-12-17T18:41:37ZZeichen 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#m1779322Rolf B2020-12-17T20:30:16Z2020-12-17T20:30:27ZZeichen 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#m1779324Der Martin2020-12-17T20:42:51Z2020-12-17T20:42:51ZZeichen 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>