problem powstaje, gdy casting do array
obiekt, który ma klucze tekstowe, które są ważne całkowitymi.
Jeśli masz ten obiekt:
object(stdClass)#1 (2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
i rzucasz ją
$array = (array)$object
dostać tę tablicę
array(2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
który ma klucze, które można uzyskać tylko poprzez zapętlenie za ich pośrednictwem, ponieważ bezpośredni dostęp, taki jak $array["207"]
, zawsze będzie converted do $array[207]
, która nie istnieje.
Ponieważ otrzymujesz przedmiot jak ten powyżej z json_decode()
stosowanego do łańcucha jak
$json = '{"207":"sdf", "210":"sdf"}'
Najlepszym rozwiązaniem byłoby, aby uniknąć klawiszy numerycznych w pierwszej kolejności. Są one prawdopodobnie lepsza modelowane jako wartości numeryczne tablicy obiektów:
$json = '[{"numAttr":207, "strAttr":"sdf"}, {"numAttr":210, "strAttr":"sdf"}]'
Struktura danych ma wiele zalet w porównaniu z obecnym drugim:
- lepiej odzwierciedla oryginalnych danych, a zbiór obiektów które mają właściwość numeryczną
- jest łatwo rozszerzalny z innymi właściwościami
- jest bardziej mobilny w różnych systemach (jak widać, aktualna struc dane jest przyczyną problemów w PHP, ale jeśli użytkownik powinien używać innego języka, może łatwo napotkać inne podobne problemy).
Jeśli potrzebna jest mapa obiektów obiektu →, można ją szybko uzyskać, np.Coś takiego:
function getNumAttr($obj) { return $obj->numAttr; } // for backward compatibility
$arr = json_decode($json); // where $json = '[{"numAttr":...
$map = array_combine(array_map('getNumAttr', $arr), $arr);
Innym rozwiązaniem byłoby zrobić jako ASCII-wapienne zasugerował: siła json_decode()
do wyjściowych tablic asocjacyjnych zamiast obiektów, ustawiając swój drugi parametr do true
:
$map = json_decode($json, true);
Dla twoje dane wejściowe to produkuje bezpośrednio
array(2) {
[207]=>
string(3) "sdf"
[210]=>
string(3) "sdf"
}
Zauważ, że klucze tablicy są teraz liczbami całkowitymi zamiast ciągów.
Uważam jednak, że zmiana struktury danych JSON jest znacznie czystszym rozwiązaniem, chociaż rozumiem, że może nie być to możliwe.
Wypróbuj 'var_dump (key ($ output))' i powiedz nam, co otrzymujesz. – deceze
Potrzebujesz więcej informacji. Jaki kontekst? Czy jest to skrypt po stronie serwera? –
@deceze: Jest to wyjściowy ciąg '207' (długość = 3) ' –