Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z rzutowaniem stdClass na array
Forum PHP.pl > Forum > Przedszkole
phpion
Witam,
mam problem, z którym walczę i nie wiem jak go obejść :|

Do funkcji przekazuję pary parametrów stylów CSS w postaci stdClass (zamieszczam wyniki var_dump) jako $property oraz $value:
Kod
object(stdClass)#62 (2) {
  ["0"]=>
  string(5) "color"
  ["1"]=>
  string(11) "font-weight"
}
object(stdClass)#63 (2) {
  ["0"]=>
  string(7) "#CF1020"
  ["1"]=>
  string(4) "bold"
}

Wewnątrz funkcji, do której je przekazuje rzutuję je na tablice:
  1. $properties = (array)$property;
  2. $values = (array)$value;

w wyniku czego dostaję:
Kod
array(2) {
  ["0"]=>
  string(5) "color"
  ["1"]=>
  string(11) "font-weight"
}
array(2) {
  ["0"]=>
  string(7) "#CF1020"
  ["1"]=>
  string(4) "bold"
}

Następnie iteruję po elementach $properties i przypisuję do nich wartość z $values:
  1. foreach ($properties as $key => $property) {
  2. $value = $values[$key];
  3. }

W wyniku tego dostaję:
Cytat
Notice: Undefined index: 0 in ...
Notice: Undefined index: 1 in ...

O co chodzi? :| Sprawdzałem w pętlach typy indeksów tablic - zawsze są to stringi. Próbowałem jawnie zrzutować $key na string ((string)$key) i też kupa.

Proszę o pomoc, rady, wskazówki,
pion

PS:
Po drodze w pętli foreach daję sobie testowy warunek:
  1. if (!isset($values[$key])) {
  2. echo $key.' nie istnieje w '.print_r($values, true);
  3. var_dump($key);
  4. }

co oczywiście pokazuje:
Cytat
0 nie istnieje w Array
(
[0] => #CF1020
[1] => bold
)
string(1) "0"

i analogicznie dla indeksu 1.

PS2:
Dałem na razie jawne "przepisanie" tablicy i działa:
  1. $properties = array_values((array)$property);
  2. $values = array_values((array)$value);

Co nie zmienia faktu, że chciałbym dojść do tego dlaczego pierwotne rozwiązanie nie działa.
wookieb
Odpaliłem na php 5.3 coś takiego
  1. $arr = array('0'=>'value', '1'=>'test');
  2. $arr2 = array('0'=>'k1', '1'=>'k2');
  3. $property = (object)$arr;
  4. $value = (object)$arr2;
  5.  
  6. $properties = (array)$property;
  7. $values = (array)$value;
  8.  
  9. foreach($properties as $key=>$property)
  10. {
  11. $value = $values[$key];
  12. echo $value;
  13. }
i wszystko ok. Pokaż skąd masz te obiekty i jaka wersja php.
phpion
  1. // Przetwarza tablicę asocjacyjną na obiekt stdClass.
  2. function array2stdclass(array $array) {
  3. $return = new stdClass();
  4.  
  5. foreach ($array as $key => $item) {
  6. if (is_array($item)) {
  7. $return->$key = array2stdclass($item);
  8. }
  9. else {
  10. $return->$key = $item;
  11. }
  12. }
  13.  
  14. return $return;
  15. }
  16.  
  17. // Dodaje styl.
  18. function add_style($property, $value) {
  19. $properties = (array)$property;
  20. $values = (array)$value;
  21.  
  22. // Tak działa:
  23. //$properties = array_values((array)$property);
  24. //$values = array_values((array)$value);
  25. //
  26.  
  27. foreach ($properties as $key => $property) {
  28. // I tutaj jest zonk :|
  29. $value = $values[$key];
  30. }
  31. }
  32.  
  33. $config = array(
  34. 'styles' => array(
  35. 'property' => array('color', 'font-weight'),
  36. 'value' => array('#CF1020', 'bold')
  37. )
  38. )
  39. );
  40.  
  41. // Tablica do stdClass.
  42. $config = array2stdclass($config);
  43.  
  44. // Pętla dodająca style.
  45. foreach ((array)$config->styles as $style) {
  46. if (isset($style->property) && isset($style->value)) {
  47. add_style($style->property, $style->value);
  48. }
  49. }

PHP 5.2.5
wookieb
Udało mi się wyczytać coś takiego
http://pl2.php.net/manual/en/language.type...s.array.casting

Cytat
If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name.

Pewnie dlatego, że nie możesz mieć zmiennej o nazwie $0 dlatego tak dziwnie konwertuje. Spójrz na to

  1. foreach($properties as $key=>$property)
  2. {
  3. //$key = trim($key);
  4. $properties[$key] = $property.'t';
  5. }
  6. print_r($properties);


Wynik:
Kod
Array
(
    [0] => value
    [1] => test
    [0] => valuet
    [1] => testt
)


Dlatego jak wyczytałem, przy takich obiektach (w których wlasciwosci sa nazwami numerycznymi) należy przekonwertować obiekt za pomocą tej funkcji
  1. function object2array($object) {
  2. if (is_object($object)) {
  3. foreach ($object as $key => $value) {
  4. $array[$key] = $value;
  5. }
  6. }
  7. else {
  8. $array = $object;
  9. }
  10. return $array;
  11. }

phpion
Dzięki za informacje. Nie zmienia to jednak faktu, że isset() w tym przypadku działa dość dziwnie... niby nie ma, a jednak jest...
wookieb
Tak ale skoro nie mozna dostać się do wartości to po co isset miałby ci mówić, że wartość jest? I tak się do niej nie dostaniesz. Więc według mnie jest to prawidlowe smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.