Autor Zpráva
TomasJ
Profil
Zdravím.
Mám problém s objektem, resp. s polem...
Mám pole:
$a = Array(
Array("ID"=>50,"Text"=>"ABC"),
Array("ID"=>100,"Text"=>"DEF"));
//Převedu ho na objekt - vypadá pak lépe, protože pak výsledek vyvolávám z metody určité třídy.
$a = (object)$a;

Jak se potom dostanu k prvnímu objektu (kde ID = 50) z objektu $a?
Ono totiž $a->0 nejde ...
Zkoušel jsem $a->{0} a to mi vrací NULL.
candiess
Profil
TomasJ:
http://stackoverflow.com/questions/1869812/casting-an-array-with-numeric-keys-as-an-object

Alias:
<?php
$a = array('cat','dog','pheasant');
$o = new stdClass;
foreach ($a as $k => $v) {
    if (is_numeric($k)) {
        $k = "_{$k}";
    }
    $o->$k = $v;
}
echo $o->_0; //cat
?>
TomasJ
Profil
Toto je opravdu jediný způsob?
candiess
Profil
TomasJ:
Jak jsi zmínil $a->0 nejde, s řetězovými indexy by to byla prča, ale co se týče těch numerických bude toto asi jediný způsob.
TomasJ
Profil
candiess:
Tak tedy děkuji :) Funguje to jak má.
Tori
Profil
Zkuste si tohle ;)

$a = array('nula', 'jedna', 7 => 'sedm');
$obj = new stdClass;
foreach ($a as $key => $val) {
    $obj->$key = $val;
}
var_dump($obj);
echo '<br>7 = ', $obj->{'7'};
$x = 1;
echo "<br>$x = ", $obj->$x;
Jediná nešikovná věc je ten převod.
TomasJ
Profil
Tori:
Nóóó, Tak to je hezčí forma. Takže děkuji moc, použiji ten Váš způsob.

Alespoň vidím více možností jak to řešit. Jedině dobře :)
Jan Tvrdík
Profil
Asi by se hodilo stručně vysvětlit, jak je možné, že řešení od Tori funguje.
Je to proto, že PHP neumožňuje přístup k vlastnostem s číselným názvem. PHP pole nemůže obsahovat číselný klíč ve formě řetězce (např. klíč '123' je převeden na 123) a při automatickém převodu na objekt jsou datové typy klíčů zachovány.

$pole1 = array('123' => 'foo');
$pole2 = array(123 => 'foo'); // identické s $pole1

var_dump($pole1);
var_dump($pole2);

$obj1 = (object) $pole1;
$obj2 = new stdClass();
$obj2->{123} = 'foo'; // vznikne vlastnost se stringovým názvem

var_dump($obj1);
var_dump($obj2);

Výstup:
array(1) {
  [123]=>
  string(3) "foo"
}
array(1) {
  [123]=>
  string(3) "foo"
}
object(stdClass)#1 (1) {
  [123]=>
  string(3) "foo"
}
object(stdClass)#2 (1) {
  ["123"]=>
  string(3) "foo"
}
TomasJ
Profil
Díky za vysvětlení. Ono mi to už tak nějak došlo podle příkladu od Tori, ale teď to chápu 100%. :)
Tori
Profil
Jan Tvrdík:
object(stdClass)#1 (1) {
[123]=>
string(3) "foo"
}
Mě tohle zobrazí
object(stdClass)[1]
  string 'foo' (length=3)
, bez klíče (ale když se k té vlastnosti nedá přistupovat, tak je to asi jedno). Asi to dělá xdebugová verze var_dump.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: