Tom: Typkonvertierung im Arrays-Key

Hello,

Script:

<?php
$extrakey = '27';

$_test = array();

$_test[1] = 'Eins';
$_test['thomas'] = 'tommy';
$_test['2']= 'zwei';
$_test[drei] = 'drei';
$_test[$extrakey] = 'extra';

echo "<pre>\n";
echo htmlspecialchars(print_r($_test,1));

foreach($_test as $key => $val)
{
  echo "[$key] =&gt; $val | Schlüsseltyp ist ".gettype($key)." \n";
}

echo "</pre>\n";
?>

Ausgabe:

Array
(
    [1] => Eins
    [thomas] => tommy
    [2] => zwei
    [drei] => drei
    [27] => extra
)
[1] => Eins | Schlüsseltyp ist integer
[thomas] => tommy | Schlüsseltyp ist string
[2] => zwei | Schlüsseltyp ist integer
[drei] => drei | Schlüsseltyp ist string
[27] => extra | Schlüsseltyp ist integer

Frage:

kann man sich darauf verlassen, dass die Umwandlung der "numerisch aussehenden" Schlüssel, die als String erfasst wurden, in Integer-Werte verbrieft ist und so bleiben wird?

Ich frag nur, weil bei PHP schon öfter sinnvolle Dinge zu unsinnigen geändert wurden.

Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  1. Hallo,

    Frage:

    kann man sich darauf verlassen, dass die Umwandlung der "numerisch aussehenden" Schlüssel, die als String erfasst wurden, in Integer-Werte verbrieft ist und so bleiben wird?

    Ich frag nur, weil bei PHP schon öfter sinnvolle Dinge zu unsinnigen geändert wurden.

    Warum fragst du nicht die Entwickler von PHP? Ich hallte es allerdings für Unsinnig sich über eine evtl. theoretisch möglich Änderung den Kopf zu zerbrechen. Sollte es in zukünftigen PHP Versionen nicht mehr funktionieren kann man vorläufig bei einer älteren bleiben und in Ruhe sich Gedanken über das Problem machen.

    Grüße

    Markus

  2. Hello,

    Ergänzungsfrage:

    Was wird schneller sein bzw. weniger Ressourcen schlucken

    ein Array in der Form:

    # $_data['l1']  = array();
      # $_data['p7']  = array();
      # $_data['s3']  = array();
      # $_data['l2']  = array();
      # $_data['l3']  = array();

    # $_data['l1'][0]  = 'Natrium';
      # $_data['l1'][1]  = 'Phosphor';
      # $_data['l1'][3]  = 'Barium';

    # $_data['p7'][0]   = 0;
      # $_data['p7'][5]   = 7;
      # $_data['p7'][27]  = 4;

    usw.

    Es soll der größte vorhandene numerische Schlüssel des Monsters ermittelt werden.

    #1. ---------------------------------

    $maxkey = 0;

    foreach($_data as $_column => $key)
      {
        foreach($_column as $key => $val)
        {
          if (gettype($key) == 'integer')
          {
            $maxkey = max($maxkey,$key);
          }
        }
      }
    #-----------------------------------.1

    oder

    #2. ---------------------------------
      $maxkey = 0;

    foreach($_data as $_column => $key)
      {
        $_colnames = array_keys($_data);
        $max = max($_colnames);
        $maxkey = ($maxkey, $max);
      }

    #---------------------------------.2

    oder

    #3. ---------------------------------

    irgendwas mit array_map() oder array_walk() oder sonstiges...

    Nur da fällt mir heuite Abend nix mehr ein :-(

    #---------------------------------.3

    Das Datenarray kann recht groß werden, sodass ich schon gerne die schnellste Funktion hätte. Außerdem muss ich vermutlich auch an den Speicher denken. Es wird PHP 4.3.x und hher eingesetzt. Mit Referenzen bei foreach() [hab eben auch nocht gesehen, dass es die schon gibt] kann ich also nicht arbeiten.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. echo $begrüßung;

      Mit Referenzen bei foreach() [hab eben auch nocht gesehen, dass es die schon gibt] kann ich also nicht arbeiten.

      Referenzen sollen nur dann verwendet werden, wenn sie technisch notwendig sind, nicht wenn du dir dadurch eine Einsparung einer Kopie erhoffst. Denn PHP kopiert während einer Zuweisung einer Variablen zu einer anderen nicht. Erst wenn sich einer der beiden Werte ändert wird kopiert.

      http://de.php.net/manual/en/function.debug-zval-dump.php Dort weiter bei References Explained (by Derick Rethans).

      echo "$verabschiedung $name";

  3. echo $begrüßung;

    kann man sich darauf verlassen, dass die Umwandlung der "numerisch aussehenden" Schlüssel, die als String erfasst wurden, in Integer-Werte verbrieft ist und so bleiben wird?

    Verlassen kann man sich nie, aber: http://de.php.net/manual/en/language.types.array.php
    »A key may be either an integer or a string. If a key is the standard representation of an integer, it will be interpreted as such (i.e. "8" will be interpreted as 8, while "08" will be interpreted as "08").«

    echo "$verabschiedung $name";

  4. Hello,

    nur fürs Archiv hier die Funktion mit Musterdaten
    Ich habe mir gerade einen abgebrochen dabei :-/
    Brauche mal wieder eine Pause

    $_data = array();

    $_data['l1']  = array();
       $_data['p7']  = array();
       $_data['s3']  = array();
       $_data['l2']  = array();
       $_data['l3']  = array();

    $_data['l1'][0]  = 'Natrium';
       $_data['l1'][1]  = 'Phosphor';
       $_data['l1'][3]  = 'Barium';

    $_data['p7'][0]   = 0;
       $_data['p7'][5]   = 7;
       $_data['p7'][27]  = 4;

    $_data['s3'][10]   = 0;
       $_data['s3']['5']   = 7;
       $_data['s3'][312]  = 4;

    $_data['l3'][0]   = 0;
       $_data['l3']['5']   = 7;
       $_data['l3']['nase']  = 4;
       $_data['l3'][10]   = 0;
       $_data['l3'][15]   = 7;
       $_data['l3'][312]  = 4;

    function array_get_maxkey($_data)
    {
      $maxkey = 0;

    foreach($_data as $colname => $_colval)
      {
        foreach($_colval as $num => $val)
        {
          if (gettype($num) == 'integer')
          {
            $maxkey = max($num, $maxkey);
          }
        }
      }

    return $maxkey;
    }

    Die Funktion ermittelt den größten numerischen Schlüssel in der "zweiten Dimension"

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)