Pergunta

Eu tinha essa pergunta anterior e concluiu-se que era um bug no 5.2.5. Bem, ele ainda está quebrado em 5.2.6, pelo menos para mim:

Por favor, deixe-me saber se ele está quebrado ou obras para você:

$obj = new stdClass();
$obj->{"foo"} = "bar";
$obj->{"0"} = "zero";
$arr = (array)$obj;

//foo -- bar
//0 --    {error: undefined index}
foreach ($arr as $key=>$value){
    echo "$key -- " . $arr[$key] . "\n";
}

Todas as maneiras para "consertar" a matriz depois de ter sido lançada a partir de um stdClass?

Foi útil?

Solução

Parece definitivamente como um bug para mim (PHP 5.2.6).

Você pode corrigir a matriz como este:

$arr = array_combine(array_keys($arr), array_values($arr));

Tem sido relatado na este relatório de bug mas marcado como falso .. . a documentação diz :

As chaves são a variável de membro nomes, com algumas exceções notáveis: Propriedades inteiros são inacessíveis;

Outras dicas

Um pouco de shows experimentação phps funções próprias não persistem este fubarity.

function noopa( $a ){ return $a; }
$arr = array_map('noopa', $arr ); 
$arr[0]; # no error! 

Este efeito, apenas cria uma cópia da matriz, e a correção ocorre durante a cópia.

Em última análise, o seu fracasso design um em toda a linha, tente usar array_merge da maneira que você acha que funciona em uma matriz com teclas numéricas e cadeia mista?

Todos os elementos numerados são copiados e alguns get re-numeradas, mesmo que alguns apenas acontecer a ser encapsulado-string-números, e, como resultado, existem dezenas de implementações homebrew de array_merge apenas para resolver este problema.

Voltar ao php tentou fazer um clone do perl e falhou, eles não compreender o conceito de matrizes e hashes sendo conceitos distintos, uma vez globbed-los juntos em um guarda-chuva universal. Bom andamento!.

Para o seu próximo truque, eles conseguem quebrar delimitadores de namespace por causa de algum problema técnico que nenhuma outra língua tem, por algum motivo encontrado.

Graças RoBorg .. eu só descobri que tão bem:)

Aqui está uma outra solução, não tenho certeza se é rápido ou não:

unserialize(serialize($arr));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top