Array Probleme

Falloutboy6

Mitglied
Hallo zusammen,

ich versuche das Problem mal verständlich zu erklären. Ich habe eine Kostenstaffel die wie folgt aussieht.

Code:
(25:0)(35:6,7,80,9)

Die Zahl vor dem : ist der Preis und die Zahlen nach dem : sind die dazugehörigen PLZ Gebiete.

Mit preg_match_all lese ich mir die einzelnen Teile in ein ARRAY aus. Soweit funktioniert es ganz gut.

Wenn nun ein Auftrag abgerechnet werden soll muss ich anhand der PLZ vom Auftrag herausfinden zu welchem Preis dieser abgerechnet werden kann, eben 25 oder 35. Wenn ich jetzt eben einen Auftrag mit 90546 habe müsste am Schluss 35 rauskommen. Ich habe es mit folgendem Ansatz probiert aber komme nicht wirklich weiter, wie ich den richtigen Preis aus meinem Array rausbekomme anhand der PLZ. Die die PLZ ja 5 stellig ist und der Wert im Array nur 1 stellig oder 2. Ich kann aber nicht ausschließen, dass es auch mal einen Wert mit 3,4 oder 5 gibt. Wer kann mir hier helfen? Mein jetziger Code sieht wie folgt aus

PHP:
<?php
  $preis_pro_auto = "(25:0)(35:6,7,80,9)";
  preg_match_all('#\((\d+):(\d+(,\d+)*)\)#', $preis_pro_auto, $treffer_kosten);
  
  $zeile_anfragen['plz'] = 90546;
  $zahl = $zeile_anfragen['plz'];
  
  $map = array();
  foreach ($treffer_kosten[2] as $idx => $prefixes) {
    $prefixes = explode(',', $prefixes);
  
      //Schleife für Kosten
      foreach ($prefixes as $prefix) {
        $map[$prefix] = $treffer_kosten[1][$idx];
      }
  }
    
  echo "<pre>";
  print_r($map);
  echo "</pre>";
  
  $preis = $map[$zahl];
  
  echo "Zahl: " . $zahl . "<br>";
  echo "Preis: " . $preis;
?>

Vielen Dank.
 
Versuch doch mal das:

PHP:
<?php
  $preis_pro_auto = "(25:0)(35:6,7,80,9)";
  preg_match_all('#\((\d+):(\d+(,\d+)*)\)#', $preis_pro_auto, $treffer_kosten);
  
  $zeile_anfragen['plz'] = 90546;
  $zahl = $zeile_anfragen['plz'];
  
  $map = array();
  foreach ($treffer_kosten[2] as $idx => $prefixes) {
    $prefixes = explode(',', $prefixes);
  
      //Schleife für Kosten
      foreach ($prefixes as $prefix) {
        $map[$prefix] = $treffer_kosten[1][$idx];
      }
  }
    
  echo "<pre>";
  print_r($map);
  echo "</pre>";
  
  while(!array_key_exists($zahl, $map))
	$zahl = substr($zahl, 0, -1);
  
  $preis = $map[$zahl];
  
  echo "Zahl: " . $zahl . "<br>";
  echo "Preis: " . $preis;
?>

Edit: Hier der untere Teil noch mal ein bisschen verbessert:

PHP:
  while($zahl && !array_key_exists($zahl, $map))
	$zahl = substr($zahl, 0, -1);
  
  if($zahl)
  {
	$preis = $map[$zahl];
	echo "Zahl: " . $zahl . "<br>";
	echo "Preis: " . $preis;
  }
 
Zuletzt bearbeitet:
super danke dir. Sieht schon sehr gut aus. Nur besteht das Problem noch wenn die PLZ mit einer 0 anfängt. Wie fange ich das am besten ab?
 
Solange die 0 teil des PLZ-Strings ist, ist das doch kein Problem, der Fall wird doch behandelt. Um das Teil eines Strings werden zu lassen, musst du mitteilen, das die PLZ auf jeden Fall mindestens 5 Zeichen lang sein muss:

PHP:
$zahl = sprintf("%05d", $zahl);
 
vielen Dank für deine super Hilfe. Jetzt scheint alles so zu funktionieren wie ich es mir vorstelle. Dir noch ein schönes Wochenende.
 
Warum werden die schönen array-Funktionen nicht angewendet? Foreach ist schon schön. muss aber nicht immer verschachtelt gebraucht werden. Dazu hat php zig Array-Funktionen
PHP:
$preisProAuto = '(25:0)(35:6,7,80,9)';
preg_match_all('/\((\d+):([^\)]+)\)/is', $preisProAuto, $results);
//Resultat kombinieren zu Array('25' => '0', '35' => '6,7,80,9') 
$list = array_combine($results[1], $results[2]);
$map = array();
foreach($list as $price => $digits){
    //Werte in Array wandeln und als Key verwdnen um einen neuen Array mit dem Preis als Wert erstellen
    //array_fill_keys(explode(',', $digits), $price): mit price = 35 und digits = '6,7,80,9':
    // -> Array(6 => 35, 7 => 35, 80 => 35, 9 => 35) 
    $map = $map + array_fill_keys(explode(',', $digits), $price);
}

Nachtrag: Und weils grad so schön Spass macht, noch mehr komprimiert mittles Array-Funktionen
PHP:
$preisProAuto = '(25:0)(35:6,7,80,9)';
preg_match_all('/\((\d+):([^\)]+)\)/is', $preisProAuto, $results);
$maps = array_map(create_function('$price, $digits', 'return array_fill_keys(explode(",", $digits), $price);'), $results[1], $results[2]);
$map = array_reduce($maps, create_function('$m,$n', 'return (is_array($m)?$m:array()) +$n;'));
 

Neue Beiträge

Zurück