Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

219
Visualizações
¿Por qué 'iterator_to_array' da resultados diferentes a foreach?

Supongamos que tengo la siguiente función recursiva para convertir una matriz en un generador:

 function traverse(array $items): Generator { if (!empty($items)) { yield $items[0]; array_shift($items); yield from traverse($items); } }

Ejecutar esta función e iterar sobre el Generador a través de un foreach da el resultado esperado:

 $values = traverse(['a', 'b', 'c', 'd', 'e']); foreach ($values as $value) { echo $value; } // 'abcde' is echoed

Sin embargo, cuando uso la función incorporada iterator_to_array() , obtengo el siguiente resultado:

 $values = iterator_to_array(traverse(['a', 'b', 'c', 'd', 'e'])); foreach ($values as $value) { echo $value; } // Only 'e' is echoed

Esperaría que ambas piezas de código se comportaran de manera idéntica, pero no es así. ¿Por qué su comportamiento es diferente?

Estoy ejecutando esto en PHP 8.1.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Del manual :

yield from no restablece las claves . Conserva las claves devueltas por el objeto o matriz Traversable. Por lo tanto, algunos valores pueden compartir una clave común con otro rendimiento o rendimiento de, que, al insertarse en una matriz, sobrescribirá los valores anteriores con esa clave.

Un caso común en el que esto es importante es iterator_to_array() que devuelve una matriz con clave de forma predeterminada, lo que puede generar resultados inesperados. iterator_to_array() tiene un segundo parámetro use_keys que se puede establecer en falso para recopilar todos los valores mientras se ignoran las claves devueltas por el Generador.

Su generador devuelve un elemento con la misma clave cada vez (porque se restablecen después de la llamada array_shift ), por lo que iterator_to_array sobrescribe cada elemento con el siguiente. Es por eso que solo está viendo que se devuelve el elemento final.

Si pasa el argumento use_keys a la función como false , obtendrá el comportamiento deseado, por ejemplo

 $values = iterator_to_array(traverse(['a', 'b', 'c', 'd', 'e']), false);

Ver https://3v4l.org/jWbt4

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda