Bestimmten Wert aus einem Array filtern.

xtramen01

Erfahrenes Mitglied
Hallo Leute,
ich habe ein Problem wo ich leider alleine nicht weitr komme.
Ich brauche aus einem Array einen bestimmten Wert und komme an den nicht ran.

In der Konstante 'MODULE_SHIPPING_TABLE_COST' sind Tabellarische Werte gespeichert.
Wenn nun $order_total z.b. 100 oder > 100 ist dann brauche ich den Wert 1. Wenn $order_total 200 oder > 200 ist, dann den Wert 2 usw.

Ich habe da was gebastelt, habe aber dann das Problem, das mir der letzte Wert nicht mehr angezeigt wird. Also wenn $order_total = 300 oder > 300 ist.
Hat jemand eine Idee? Vielen Dank!

PHP:
   define('MODULE_SHIPPING_TABLE_COST', '100:1,200:2,300:3');

   $order_total = 201;
   $var = array();

      $table_cost = preg_split("/[:,]/" , MODULE_SHIPPING_TABLE_COST);
      $size = sizeof($table_cost);
      for ($i=0, $n=$size; $i<$n; $i+=2) {
          $var[$i] = $table_cost[$i+1];
        if ($order_total <= $table_cost[$i]) {
          $last_key = $i-2;
          break;
        }
      }
      //if(isset($last_key)){
        if(key_exists($last_key,$var)){
           echo $var[$last_key];
        }
      //}
 
Ist es wirklich so das bei 100 der Wert 1, bei 200 der Wert 2, bei 300 der Wert 3 usw. gesucht wird?
 
Jap.
Unter Berücksichtigung der Zwischenwerte. Also wenn die Variable $order_total = 150 ist, dann muss auch 1 rauskommen....bis zum nächsten Wert 200.
Vielleicht lieg ich mit meinem Ansatz ja total falsch.

Ich habe nun der KOnstante einen utopischen Wert angehängt. So funktioniert es zwar, aber ich finde das extrem gepfuscht :-/

PHP:
   define('MODULE_SHIPPING_TABLE_COST', '100:1,200:2,300:3');

   $order_total = 701;
   $var = array();

      $table_cost = preg_split("/[:,]/" , MODULE_SHIPPING_TABLE_COST . ', 50000000000000000000000000000000000000000000:0');
      $size = sizeof($table_cost);

      for ($i=0, $n=$size; $i<$n; $i+=2) {
          $var[$i] = $table_cost[$i+1];
        if ($order_total <= $table_cost[$i]) {
          $last_key = $i-2;
          break;
        }
      }

      if(isset($last_key)){
        if(key_exists($last_key,$var)){
           echo $var[$last_key];
        }
      }

Gruß
 
Zuletzt bearbeitet:
Also gehen tut es damit:

PHP:
<?php
define('MODULE_SHIPPING_TABLE_COST', '100:1,200:2,300:3');

$order_total = 201;

$var = preg_split("/[:,]/" , MODULE_SHIPPING_TABLE_COST);

// Keys erstellen
$table_cost = array();
for ($a = 0; $a < count($var)-1; $a = $a + 2) {
	$table_cost[$var[$a]] = $var[$a+1];
}

// Auswerten
$wert = 0;

foreach (array_keys($table_cost) as $key) {
	if ($order_total >= $key && $order_total <= ($key + 99)) {
			$wert = $table_cost[$key];
	}
}

if ($wert == 0) $wert = $table_cost[$key];

echo $wert;
?>

Bin mir aber sicher das es da noch schönere Lösungen dafür gibt.
 
Zuletzt bearbeitet:
Einen Array bilden mit deinem Wert als Index und dem Ausgabewert als Value.
Absteigend sortieren, damit der grösste Wert zuerst kommt.
Dann einfach alle durchgehen bis der gesuchte Wert grössergleich dem Key ist. Dann die Kosten auslesen

PHP:
$testValue = 150;

define('MODULE_SHIPPING_TABLE_COST', '100:1,200:2,300:3'); 

//String zerlegen in 'a00:1', '200:2' etc.
$array = explode(',', MODULE_SHIPPING_TABLE_COST);
$costs = array();
//Array erstellen Array(100=>1, 200=>2, 300=>3)
foreach($array as $part){
    $items = explode(':', $part);
    $costs[$items[0]] = $items[1];
}
//Absteigend nach Key sortieren: Array(300=>3, 200=>1, 100=>1)
krsort($costs);
//Alle durchgehen bis der zu suchende Wert grösser ist als dier Key des Arrays
foreach($costs as $value => $cost){
    if($testValue >= $value) break;
    //Cost zurücksetzen auf o. Somit kommt 0 heraus fals der gesuchte Wert unterhalb des kleinsten definierten ist
    $cost = 0;
}

echo $cost;
 
Zurück