Array zusammenfassen

Ensaw

Mitglied
Hallo,

ich habe eine .csv Datei, die ich per PHP in ein Array einlese. Dort ist eine Spalte mit vielen Zeilen mit Postleitzahlen drinnen.

Ich möchte nun mit PHP die Postleitzahlen vergleichen und zusammen fassen. Heißt, PHP soll sich die erste Stelle der Postleitzahlen ansehen und am Ende sagen, wieviele mit 0, 1, 2, 3, ... anfangen.

Dies sollte dann eigentlich so aussehen:

Postleitzahlen mit 0 = 13 mal.
Postleitzahlem mit 1 = 42 mal.
etc.

Ich habe es bisher geschafft nur die .csv Datei einlesen zu lassen.

Könnte mir da jemand helfen? Bin noch recht frisch in der PHP Programmierung..
 
Erklärung ist im Code....

PHP:
//Testdaten
$plzList = array('0123','0234','0345','8000','8001');

//Array mit Key 0-9 und Wert 0 initilaisieren
$plzCount = array_fill(0, 10, 0);
//Alle Postleitzahlen durchgehen
foreach($plzList as $plz){
    //Mit dem ersten Zeichen der Postleitzahl ($plz[0]) als Key den entsprechenden Count hochzählen
    $plzCount[$plz[0]]++;
}
//Und ausgeben
print_r($plzCount);
Code:
Array
(
    [0] => 3
    [1] => 0
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 2
    [9] => 0
)

Wenn du nach den ersten 2Stellen Suchen willst, musst du das ein wneig anderst lösen
PHP:
$plzCount = array();
for($i=0; $i<100; $i++){
    //Aus der Zahl ein Text machen mit führenden 0. 3 -> '03', 42 -> '42'
    $plzCount[str_pad($i, 2, '0', STR_PAD_LEFT)] = 0;
}
foreach($plzList as $plz){
    $plzCount[substr($plz, 0, 2)]++;
}
;
 
Dein Code ist genial, dennoch bekomme ich es nicht hin, die .csv Datei mit dem Code zu verbinden.
Ich habe mehrere Zeilen wie z.b. Hausnummer oder Ort etc. in der .csv Datei, ich möchte aber nur die 6te Spalte (Da sind die Postleitzahlen gespeichert) und ab der 2ten Zeile in den Code bekommen.

Wenn ich mein altes Script verwende mit dem ich die .csv Datei einlese, bekomme ich nur millionen von Fehlern mit "Objekt kann nicht als Array verwendet werden".
 
Also die CSV-Datei ist so aufgebaut: (Natürlich mit ; getrennt, ist nur ein Beispiel)
NUMMER | NAME A| NAME B| NAME C | STRASSE | POSTLEITZAHL | ORT <- Überschrift
1 | Name A | Name B | Name C | Straße | Postleitzahl | ORT <- Infos
2 | Name A | Name B | Name C | Straße | Postleitzahl | ORT
3 | Name A | Name B | Name C | Straße | Postleitzahl | ORT
4 | Name A | Name B | Name C | Straße | Postleitzahl | ORT

PHP:
<?php
 
class gibPostleitzahl
{
    public $nummer;
    public $nameA;
    public $nameB;
    public $nameC;
    public $strasse;
    public $postleitzahl;
    public $ort;
}
		$h = fopen('XXXX/Datei.csv', 'rb');
	
		$objs = array();
	
		fgetcsv($h, 0, ';', '"', '\\');
		while ($entry = fgetcsv($h, 0, ';', '"', '\\')) {
			$tmp = new gibPostleitzahl();
			$tmp->nummer   = $entry[0];
			$tmp->nameA   = $entry[1];
			$tmp->nameB = $entry[2];
			$tmp->nameC  = $entry[3];
			$tmp->strasse  = $entry[4];
			$tmp->postleitzahl  = $entry[5];
			$tmp->ort  = $entry[6];
	
			$objs[] = $tmp;
		}
	
		fclose($h);
		return $objs;


//CSV-Datei
$plzList = gibPostleitzahl::$postleitzahl;
 
//Array mit Key 0-9 und Wert 0 initilaisieren
$plzCount = array_fill(0, 10, 0);
//Alle Postleitzahlen durchgehen
foreach($plzList as $plz){
    //Mit dem ersten Zeichen der Postleitzahl ($plz[0]) als Key den entsprechenden Count hochzählen
    $plzCount[$plz[0]]++;
}
//Und ausgeben
print_r($plzCount);

Entweder gibt das PHP-Programm nichts aus oder es gibt mir Fehlermeldungen aus.

Was mache ich falsch?
 
Was soll diese Zeile
PHP:
$tmp = new gibPostleitzahl();
Da erstellt du eine Instanz von der Klasse in der du schon bist. Das gibt eine Endlosschleife

gibPostleitzahl() sollte auch kein Klassenname sondern eher ein Funktionsname sein.
Deine Klasse macht als Klasse eh keinen Sinn.

Mein test.csv
Code:
NUMMER;NAME A;NAME B;NAME C;STRASSE;POSTLEITZAHL;ORT
1;A1;B1;C1;S1;84500;O1
2;A2;B2;C2;S2;85600;O2

Der Code
PHP:
$handle = fopen ("test.csv","r");              // Datei zum Lesen öffnen

//Header auslesen
$header = fgetcsv ($handle, 1000, ";");
//und auf Kleinschreibung wechseln
foreach ($header as &$item) $item = strtolower($item);

$objs = array();
$plzCount = array_fill(0, 10, 0);

while ( ($data = fgetcsv ($handle, 1000, ";")) !== FALSE ){
    $obj = array_combine($header, $data);
    //Postleitzahlzähler erhöhen
    $plzCount[$obj['postleitzahl'][0]]++;
    
    $objs[] = $obj;
}
fclose($handle);
    
print_r($objs);
print_r($plzCount);;

Ausgabe $objs
Code:
Array
(
    [0] => Array
        (
            [nummer] => 1
            [name a] => A1
            [name b] => B1
            [name c] => C1
            [strasse] => S1
            [postleitzahl] => 84500
            [ort] => O1
        )
    [1] => Array
        (
            [nummer] => 2
            [name a] => A2
            [name b] => B2
            [name c] => C2
            [strasse] => S2
            [postleitzahl] => 85600
            [ort] => O2
        )
)

Ausgabe $plzCount
Code:
Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 0
    [8] => 2
    [9] => 0
)
 
Zurück