Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luis Paullo

[Resolvido] Dificuldade com Array

Recommended Posts

Salve pessoal venho aqui mais uma vez, buscar a ajuda dos mais sábios!!!

 

tenho esse codigo (catei aki no forum msm);

 


public function getCSVLine() {
    //   if (function_exists('str_getcsv')) {
//            return str_getcsv($this->getLine(), $this->delimiter, $this->enclosure);
//        } else {

	  while ( $data = fscanf($this->handler , '%s\t%s\t%s\n' ) ) {
                      $fContents [ ] = preg_replace ( '/\s{2,}/' , null , reset ( $data ) ) ;
                }
	    array_shift ( $fContents ) ;

		foreach($fContents as $key=>$line){
			 $array[] = explode(',', $line);
			}
   return $array;
       }


////uso

foreach ($csv->getIterator() as $key => $dados) {

   var_dump($dados);

Saida:

array
 0 => 
   array
     0 => string 'Keniton' (length=7)
     1 => string 'keniton@hotmail.com' (length=24)
 1 => 
   array
     0 => string 'Fernanda' (length=8)
     1 => string 'fer_oliveirasilva@hotmail.com' (length=29)
....

 

Oque preciso é de uma saida assim;

array
 0 => string 'Keniton' (length=7)
 1 => string 'kenitonin@hotmail.com' (length=24)
array
 0 => string 'Fernanda' (length=8)
 1 => string 'fer_oliveirasilva@hotmail.com' (length=24)

 

tentei array_values (a unica coisa que conheço =X)

 

mais num da certo alguem sabe qual função me ajudaria com esse problema?

 

desde já agradeço a ajuda ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas essa estrutura que você quer é o valor de $dados a cada iteração do foreach.

 

Você não vai conseguir mais de um "bloco" de dois índices numa mesma matriz em havendo mais de um deles.

 

Vamos temporariamente atribuir $csv->getIterator() para uma variável $CSVData, porque não é possível fazer, por exemplo, $csv->getIterator()[0]

 

Do jeito que você quer, na primeira iteração do loop $CSVData[0] valeria Keniton e $CSVData[1] valeria keniton@hotmail.com

 

Na segunda, respectivamente Fernanda e fer_oliveirasilva@hotmail.com, porém perceba, esses novos valores estarão NO MESMO ÍNDICE dos dois anteriores, sobrescrevendo-os.

 

Espero que tenha dado para entender, ficou um pouco confuso mesmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entedi não =X

 

se ta m dizendo que não tem como se feito!!! é isso =X

 

 

fiz isso q você falo pra ve oq aconteceria...

 

a saida foi a msm coisa

 

$data[] = $csv->getIterator();
foreach ($data[0] as $key => $dados) {


var_dump($dados);


saida

array
 0 => 
   array
     0 => string 'Keniton' (length=7)
     1 => string 'keniton@hotmail.com' (length=24)
 1 => 
   array
     0 => string 'Fernanda' (length=8)
     1 => string 'fer_oliveirasilva@hotmail.com' (length=29)

 

assim me da a saida como quero :

 

Porem so re metorna a primeira linha do array =(

 

foreach ($data[0] as $key => $dados)
var_dump(preg_replace ( '/\s{2,}/' , null , reset ( $dados ) )); // uso sem intender =X 


saida
 0 => string 'Keniton' (length=7)
 1 => string 'kenitoningai@hotmail.com' (length=24) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele quis dizer que isso não pode ser feito, porque se você põe duas arrays dentro de uma variável, ela vai se tornar uma array, consequentemente as duas arrays contidas irão ganhar índices.

Compartilhar este post


Link para o post
Compartilhar em outros sites

q p**** em =X

 

fala serio :(

 

como q vo substitui essa função então str_getcsv

 

  public function getCSVLine() {

	//PHP 5.3 
       if (function_exists('str_getcsv')) {
           return str_getcsv($this->getLine(), $this->delimiter, $this->enclosure);

	} else {
         //PHP 5.2 
	  while ( $data = fscanf($this->handler , '%s\t%s\t%s\n' ) ) {
                      $fContents [ ] = preg_replace ( '/\s{2,}/' , null , reset ( $data ) ) ;
                }

	    array_shift ( $fContents ) ;

		foreach($fContents as $key=>$line){
			 $array[] = explode(',', $line);
			}

			return $array;
	}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entedi não =X

 

se ta m dizendo que não tem como se feito!!! é isso =X

Basicamente, sim :yay:

 

fiz isso q você falo pra ve oq aconteceria...

 

a saida foi a msm coisa

E quando foi que eu falei para você atribuir à uma variável qualquer usando a notação de colchetes?

 

Entenda, quando você pendura um par de colchetes em qualquer variável, ela automaticamente virá um array.

 

assim me da a saida como quero :

 

Porem so re metorna a primeira linha do array =(

Mas é claro.

 

Quando você informar que o foreach deverá trabalhar com $data[0], você manualmente força ele a só operar com o primeiro bloco. NUNCA que você vai ter acesso aos outros, o forwch nem sbe que eles existem!

 

Recomento fortemente que você leia mais o Manual. Para esse problema em particular, pelo menos o Livro de Arrays e mais sobre foreach

 

[EDIT]

 

Poste mais informações e de repente encontra-se outra forma. Mas entenda que, da forma que quer, NÃO É POSSÍVEL.

 

Seja qual for a solução, invariavelmente, ela vai ter a mesma estrutura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

=D

 

Eu Realmente ainda to aprendendo. Obrigado pelas dicas.. sempre busco um help no manual. maiss.. =X

 

Oque que tenho e uma class de leitura de CSV.. peguei do João Batista aki msm no forum..

 

Porem str_getcsv e so interpretado apartir do PHP 5.3 - meu hosting e o 5.2

 

ai deu a m*****.

 

o script le uma linha do CSV joga no interator q tranforma tudo em Array; (mais ou menos isso )

 

um pouco do codigo =X

 

 
/**
    * Lê uma linha inteira do arquivo
    * @return string A linha lida do arquivo
    */
   public function getLine() {
       if ($this->testOpened()) {
           return fgets($this->handler);
       }

       return null;
   }

   /**
    * Recupera um Iterator para um arquivo CSV
    * @return CSVIterator
    */
   public function getIterator() {
       return new admv2_CSV_Adapter_CsvIterator($this);
   }
/**
    * Recupera uma linha do arquivo CSV
    * @return array
    */
   public function getCSVLine() {

	//PHP 5.3 
       if (function_exists('str_getcsv')) {
           return str_getcsv($this->getLine(), $this->delimiter, $this->enclosure);

	}

 

arquivo admv2_CSV_Adapter_CsvIterator ; esse e o cara =D

 

 

 

class admv2_CSV_Adapter_CsvIterator implements Iterator {
       /**
        * Manipulador do arquivo
        * @var CSV
        */
       private $csv;

       /**
        * Número da linha atual
        * @var integer
        */
       private $key;

       /**
        * Linha atual
        * @var array
        */
       private $current;

       /**
        * Constroi um novo Iterator de CSV
        * @param CSV $csv O manipulador do arquivo CSV
        */
       public function __construct( admv2_CSV_Csv $csv ){
               $this->csv = $csv;
               $this->rewind();
       }

       /**
        * Recupera o elemento atual do Iterator
        * @return array
        */
       public function current(){
               return $this->current;
       }

       /**
        * Recupera a linha atual
        * @return integer
        */
       public function key(){
               return $this->key;
       }

       /**
        * Avança para o próximo elemento
        */
       public function next(){
               $pos = $this->csv->tell();
               $this->current = $this->csv->getCSVLine();
               ++$this->key;
       }

       /**
        * Reinicia o Iterator
        */
       public function rewind(){
               $this->key = 0;
               $this->current = array();
               $this->csv->seek( 0 );
               $this->next();
       }

       /**
        * Verifica se o Iterator é válido
        * @return boolean
        */
       public function valid(){
               return !$this->csv->eof();
       }
}

 

 

 

no mais eu preciso de uma função q le linha por linha de um arquivo me retorna elas assim na array

 

queria so modifica o getCSVLine().

 

seria bem mais pratico mais se não tem como vo tenta de outra forma

 


array
 0 => string 'Daniela' (length=7)
 1 => string 'danyalmeida77@hotmail.com' (length=25)
array
 0 => string 'Keniton' (length=7)
 1 => string 'kenitoningai@hotmail.com' (length=24)
array
 0 => string 'Fernanda' (length=8)
 1 => string 'fer_oliveirasilva@hotmail.com' (length=29)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas o que importa não é a estrutura final e sim você extrair os dados do CSV passando-os para um array.

 

A estrutura que você tem já está super simplificada. Um único foreach sobre a variável resultante, já te permite fazer o que bem entender com os dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ainda vo consegui faze da maneira certa e facil =P

 

mais no gambiarretion tmb da certo kkk

 

vlw ai Bruno pelas dicas..

 

Resolvido:

 

catei essa função de um gringo no manual e já ERAAAAAAAAAA...

 

deu a saida que eu precisava..

function str_getcsv1($input, $delimiter=',', $enclosure='"', $escape=null, $eol=null) {
		  $temp=fopen("php://memory", 'rw');
		  fwrite($temp, $input);
		  fseek($temp, 0);
		  $r = array();
		  while (($data = fgetcsv($temp, 1000, $delimiter, $enclosure)) !== false) {
		    $r[] = $data;
		  }
		  fclose($temp);
		  return $r;
	} 

$csvArr = str_getcsv1(file_get_contents('arquivos/csv/export.csv'));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Impossível!

 

Lembra do que eu falei que só por pendurar um par de colchetes vazios, a variável vira automaticamente um array?

 

Então, a cada iteração daquele while, um novo bloco de informações será adicionado no final de $data.

 

Na primeira será $data[0], depois $data[1] e por aí vai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

=X

 

ta resolvido pode tranca!!!!

 

lembro sim !! Mais cara, so sei que essa função deu a saida que eu queria =D

 

Meu codigo funciono sem o uso do str_getcsv..

 

tipo meu .CSV ta assim:

//

nome,email@email.com

nome,email@email.com

nome,email@email.com

nome,email@email.com

....

//

função me retorna isso no foreach

 

array

0 => string 'Keniton' (length=7)

1 => string 'kenitonin@hotmail.com' (length=24)

array

0 => string 'Fernanda' (length=8)

1 => string 'fer_oliveirasilva@hotmail.com' (length=24)

 

como da forma se usar o str_getcsv =X

 

estranho que qndo uso como metodo dentro da Class sai em 1 array.. Mais fora da Class funciono como queria =X

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.