2016-12-01 4 views
0

Ich habe eine CSV-Datei, die ich mit PHP analysiere. Allerdings sieht die Ausgabe wie folgt:Mehrere Arrays in PHP analysieren

Array(
    [0] => URL 
    [1] => Value 
    [2] => Author 
) 

Array(
    [0] => URL 
    [1] => Value 
    [2] => Author 
) 

Array(
    [0] => URL 
    [1] => Value 
    [2] => Author 
) 

Und so weiter ...

Wie kann ich jeden einzeln und/oder zeigen nur eine zufällig analysieren? Ich habe versucht, array_values ​​zu verwenden, aber das scheint alle Arrays auszugeben, nicht nur eins. Irgendwelche Vorschläge? Zögern Sie nicht, lassen Sie es mich wissen, wenn es noch etwas gibt, das ich anbieten kann. Danke Leute.

Bearbeiten: Hinzugefügt Code, wenn es hilft - ziemlich einfach.

//CSV to array and parse 
function parseCSV() { 
    $file = fopen('feeds/data.csv', 'r'); 
    while (($line = fgetcsv($file)) !== FALSE) { 
     //$line is an array of the csv elements 
     $arr = $line; 

     $url = array_values($arr)[2]; 
     $author = array_values($arr)[1]; 

     print_r($arr); 
    } 

    fclose($file);  
}//end 
+1

'array [0]'? oder etwas ähnliches ? –

+0

Was O/P Sie erwartet? – Tiger

+3

ist nicht wirklich klar, was das Problem ist, sollten Sie uns Ihre Parsing-Code auch zeigen – vikkio

Antwort

1
<?php 

Class CsvRandomLine 
{ 
    private $line_count=0; 
    private $random_element; 
    private $handle; 
    private $csv_arr; 

    function __construct($file='feeds/data.csv') 
    { 
     $this->handle = fopen($file, "r"); 

     $this->sort_one_element(); 
    } 


    //CSV to array and parse 
    function randomLine() 
    { 
     $i = 0; 

     // move pointer to the sorted line 
     while($i < $this->random_element) 
     { 
      $line = fgets($this->handle); 
      $i++; 
     }   

     $line = fgetcsv($this->handle); 


     //add element to $csv_arr with $url and $author 
     $this->csv_arr=array(
          "url" => $line[2], 
          "author" => $line[1] 
         ); 


    }//end 


    function get($property) 
    { 
     return $this->csv_arr[$property]; 
    } 


    function sort_one_element() 
    { 
     if($this->line_count!=0) 
     { 
      $max = $this->line_count; 
     } 
     else 
     { 

      $max = $this->countLines(); 
     } 

     $max--; 

     $n = rand(0 , $max);  

     //echo $n; 

     $this->random_element = $n; 

     rewind($this->handle);   

     $this->randomLine();  


    } 


    function countLines() 
    { 
     $linecount=0; 
     while(fgets($this->handle) !== FALSE) 
     { 
      $linecount++; 
     } 

     $this->line_count=$linecount; 

     return $linecount;    
    } 


    function __destruct() 
    { 
     fclose($this->handle); 
    } 

}  


// How to use the class: 


$csv_r = new CsvRandomLine(); 
//Construct automatic sort the first element 

echo $csv_r->get("author"); 
echo '<br>'; 
echo $csv_r->get("url"); 

echo '<hr>'; 

//Sorting another element 
$csv_r->sort_one_element(); 

echo $csv_r->get("author"); 
echo '<br>'; 
echo $csv_r->get("url"); 
+0

Dies scheint gut zu funktionieren, aber nur wenn ich die Tatsache entfernen, dass es in einer Funktion ist. – user1721449

+0

Sie haben Recht, ich habe vergessen, die Funktion im obigen Code aufzurufen. Jetzt hinzugefügt: parseCSV(); –

+0

Jetzt habe ich den Code in eine Klasse geändert. –

0

Nun, ich würde auf der CSV-Datei (immer der Header der CSV-Dokument ist die erste $line zu lesen, und ich würde es verwenden, um die Ergebnis assoc_array Schlüssel erstellen) mit allen Datensätzen das Array geladen werden, dann, wenn Sie wollen eins (das erste des Ergebnis-Arrays) oder ein zufälliges Ergebnis anzeigen (verwenden Sie einfach array_rand()).

Nur ein schmutziges Beispiel

$result = []; 
$keys = null; 
while(($line = fgetcsv($f)) !== false){ 
    if($keys === null){ 
     $keys = $line; 
     continue; 
    } 
    $row = []; 
    foreach($keys as $position => $key){ 
     $row[$key] = $line[$position]; 
    } 
    $result[] = $row; 
} 

// here you will have $result with all the records and you can get the first or do whaterver you want to show just one 

Im Fall, dass Sie nur die nackten Daten und nicht ein assoc_array Sie

$result = []; 
$keys = null; 
while(($line = fgetcsv($f)) !== false){ 
    if($keys === null){ 
     $keys = $line; 
     continue; 
    } 
    $result[] = $line; 
} 

tun könnte // hier haben Sie $ Ergebnis (Rohdaten) und $ keys (die Überschrift des csv)

+0

Natürlich könnten Sie einfach '$ all_lines [] = $ line;' in der Schleife und Schreiben Sie den ganzen Code. – RiggsFolly

+0

@RiggsFolly das Problem damit ist, dass Sie keine assoziieren haben, Sie haben $ all_lines [0], um die Kopfzeile der CSV, und alles andere zu sein, nicht ein assoc_array mit der Datennutzlast sein. – vikkio

+0

Dies gibt mir ein lesbareres Format, aber scheint jetzt ein multidimensionales Array zu sein – user1721449