Array Algorithmus zum Sortieren

  • Themenstarter Themenstarter scherlomatic
  • Beginndatum Beginndatum
S

scherlomatic

Hallo!

Vielleicht könnt ihr mir den entscheidenden Tipp geben, sitzt jetzt schon ein paar Stunden dran, und komm auf keine passende Lösung.

Ich will mein Array für einen Datenbankimport vorbereiten und muss dafür noch ein wenig mergen.

Zur Zeit sieht mein Array wie folgt aus:
Code:
Array
(
    [0] => Array
        (
            [customer_id] => 500001
            [product_type] => 2
            [country] => D
            [track] => 2
            [click] => 4
        )

    [1] => Array
        (
            [customer_id] => 500001
            [product_type] => 2
            [country] => D
            [track] => 2
            [view] => 3
        )

    [2] => Array
        (
            [customer_id] => 500001
            [product_type] => 2
            [country] => D
            [track] => 2
            [domain] => 2
        )

Und so sollte es dann aussehen:
Code:
Array
(
    [0] => Array
        (
            [customer_id] => 500001
            [product_type] => 2
            [country] => D
            [track] => 2
            [click] => 4
            [view] => 3
            [domain] => 2
        )

Also wie ihr seht, sollte der Algorithmus dann so ungefähr funktionieren
PHP:
// Durchlaufe vorhandes array
foreach ($orig_array as $key => $value) {     
      // wenn vorhanden in dem neuen array, erweitere es um das jeweilige feld
      if () 
             ?
      // sonst füg es in ein neues array hinzu
      else
            array_push($new_array, $value);
 }

Thx für eure Hilfe.
 
Wenn du es selber machen willst, dann google einfach mal nach folgenden Alogrithmen zum sortieren:

Quicksort
Heapsort
Bubblesort
merge sort
ADO sort
Insertion sort.

Wobei die Performance bei Quicksort und Heapsort, die Beste ist, kommt natürlich auch immer auf den Best und Worstcase an.

lg

Edit:
Ich sollte vllt. erst mal lesen, was du willst bevor ich antworte. Hier hat natürlich mein Vorredner schon die richtigen Funktionen genannt.
 
Zuletzt bearbeitet:
Hier mal als Denkanstoß
PHP:
$startArray = Array();

$startArray[] = Array("customer_id" => 500001,
            "product_type" => 2,
            "country" => "D",
            "track" => 2,
            "click" => 4);
            
$startArray[] = Array("customer_id" => 500001,
            "product_type" => 2,
            "country" => "D",
            "track" => 2,
            "view" => 3);
            
$startArray[] = Array("customer_id" => 500001,
            "product_type" => 2,
            "country" => "D",
            "track" => 2,
            "domain" => 2);
            
$mergedArray = Array();
$mergedArray[] = $startArray[0];

for ($i=1;$i<count($startArray);$i++){
	$diff = array_diff_key($startArray[$i],$startArray[0]);
	foreach($diff as $key=>$val){
	$mergedArray[0][$key] = $val;
	}
}

print_r($mergedArray);

Ausgabe:
Code:
Array 
( 
	[0] => Array 
		( 
			[customer_id] => 500001 
			[product_type] => 2 
			[country] => D 
			[track] => 2 
			[click] => 4 
			[view] => 3 
			[domain] => 2 
		) 
)
 
Danke für eure tollen Tipps.

Hab mir bei den selbst definierten PHP Funktionen was passendes rausgesucht (http://www.php.net/manual/en/function.in-array.php#89449).

Mein Algo macht jetzt genau das was er soll, allerdings fehlt noch ne Kleinigkeit, die auch in dem Post davor auftritt. Sonst sind die beiden Algo im Prinzip gleich.

PHP:
    $res = array();
    foreach ($startArray as $key => $value) {
      if (myInArray($res, $value['customer_id'], 'customer_id') && myInArray($res, $value['product_type'], 'product_type') && myInArray($res, $value['country'], 'country') && myInArray($res, $value['track'], 'track')) {
        if (isset($value['click']))
          $res[0]['click'] = $value['click'];
        if (isset($value['domain']))
          $res[0]['domain'] = $value['domain'];
        if (isset($value['view']))
          $res[0]['view'] = $value['view'];
      } else {
        array_push($res, $value);
      }
    }

Und zwar kann ich den Index nicht statisch (mit "0") vergeben sondern den sollte ich aus der myInArray Funktion retour bekommen. Habt ihr dafür vl auch noch ne schöne Lösung parat?

Thx
 
So bin jetzt auf eine für mich optimale Lösung gekommen, vielleicht kann man noch ein wenig Performance wo raus holen, aber fürn Anfang passts mal so.

PHP:
foreach (self::$what as $name) {
      $filename = 'log/statistic_' . $name . '_' .  $date . '.log';
      $handle = fopen($filename, "r");

      while(!feof($handle)) {
        $line = trim(fgets($handle));
        $arr = explode(';', $line);

        if(myInArray($out, $arr[0], 'customer_id') && myInArray($out, $arr[1], 'product_type') &&myInArray($out, $arr[2], 'country') && myInArray($out, $arr[3], 'track')) {
          $pos = array_search_values($arr, $out);

          if (isset($out[$pos][$name]))
            $out[$pos][$name]++;
          else
            $out[$pos][$name] = 1;
        }else {
          $tmp_array = array();
          $tmp_array['customer_id'] = $arr[0];
          $tmp_array['product_type'] = $arr[1];
          $tmp_array['country'] = $arr[2];
          $tmp_array['track'] = $arr[3];
          $tmp_array[$name] = 1;
          array_push($out, $tmp_array);
        }
      }
      fclose($handle);
    }

Und hier die beiden Hilfsfunktionen:

PHP:
function myInArray($array, $value, $key) {
  //loop through the array
  foreach ($array as $k => $val) {

//if $val is an array cal myInArray again with $val as array input
    if(is_array($val)) {
      if(myInArray($val,$value,$key))
        return true;
    }
    //else check if the given key has $value as value
    else {
      if($array[$key] == $value) {

        return true;
      }
    }
  }

  return false;
}

PHP:
function array_search_values($needle, $haystack) {
  foreach($haystack as $key => $value) {
    $current_key = $key;

    if($needle[0] == $value['customer_id'] && $needle[1] == $value['product_type'] && $needle[2] == $value['country'] && $needle[3] == $value['track'])
      return $current_key;
  }
}

Thx Stefan
 
Hab mal verscuht zu verstehen was du genau willst.. nun, habs nicht ganz auf die Reihe gekriegt.
Hab dann mal spasseshalber die Situation vom Ersten Posting umgesetzt und bin da eigentlich auf einen schönen kleinen kompakten Code gekommen

PHP:
<?php
$a = Array
(
    '0' => Array
        (
            'customer_id' => 500001,
            'product_type' => 2,
            'country' => D,
            'track' => 2,
            'click' => 4
        ),

    '1' => Array
        (
            'customer_id' => 500001,
            'product_type' => 2,
            'country' => D,
            'track' => 2,
            'view' => 3
        ),

    '2' => Array
        (
            'customer_id' => 500001,
            'product_type' => 2,
            'country' => D,
            'track' => 2,
            'domain' => 2
        ));

$keys = array_flip(array('customer_id', 'product_type', 'country', 'track')); 
$out = array();

foreach($a as $id => $line){
    $keyItems = array_intersect_key($line, $keys);
    //überprüfen ob es auch alle Key-Felder gefunden wureden und ggf gleich ein key-String zusammensetzen
    if($key = (((count($keyItems)==count($keys))? implode('####', $keyItems) : false))){
        
        //überprüfen ob in der Ausgabe bereits ein Element mit diesem Schlüssel vorhanden ist 
        if(!array_key_exists($key, $out)){
            //ggf neues Element mit den Schlüsselinformationen anlegen
            $out[$key] = $keyItems;   
        }
        //Nicht-Schlüssel Elemente extrahieren und durchloopen
        $dataItems = array_diff_key($line, $keys);
        //Herausfiltern aller Daten-Items die noch nicht in der Ausgabe sind
        $uniqueDataItems = array_diff_key($dataItems, $out[$key]);
        //Dataitems anhängen
        $out[$key] = array_merge($out[$key], $uniqueDataItems);
    }
}        
var_dump($out);
       
?>
 
Zurück