WinFuture-Forum.de: Sortier- und "Zusammenfass"-algorithmus - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Sortier- und "Zusammenfass"-algorithmus Brauche Hilfe


#1 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

geschrieben 22. Juli 2011 - 20:35

Hallo liebe Community,

ich stehe vor einem Problem und hoffe jemand hier kann mir weiterhelfen oder Denkanstöße geben.

Gegeben ist folgendes:

Zitat

A -> 1, 2, 3
B -> 1, 2, 6
C -> 1, 6, 7, 2


Ich möchte daraus das machen:

Zitat

1 -> A, B, C
2 -> C
3 -> A
6 -> B, C
7 -> A, B, C


Das funktioniert mit folgenden Code wunderbar:

$args = array(...);

$values = array();

foreach ($args as $k => $v) {
  foreach ($v as $x) {
    $values[$x] = array();
  }
}


foreach ($args as $k => $v) {
  foreach ($values as $v_k => $v_v) {
    if (in_array($v_k, $v)) {
      $values[$v_k][] = $k;
    }
  }
}



Das Endresultat soll wie folgt aussehen:

Zitat

A, B, C -> 1, 7
A -> 3
B, C -> 6
C -> 2


Mein Code funktioniert aber noch nicht ganz so, wie es soll... Es fasste nur Einträge zusammen die exakt die gleichen Werte beinhalten:

foreach ($values as $p => $s) {
    foreach ($values as $pLevel2 => $sLevel2) {
        
        // identische einträge nicht vergleichen
        if ($p === $pLevel2) {
            continue;
        }
        
        // unterschiede verstellen
        if (
          count(array_diff($s, $sLevel2)) === 0 && 
          count(array_diff($sLevel2, $s)) === 0
        ) {
            // beide keys löschen
            unset($values[$p]);
            unset($values[$pLevel2]);
            
            // und zusammengefasst als neuen eintrag in $values anlegen
            $values[$p . ',' . $pLevel2] = $s;
        }
    }
}


Wie muss ich weiter vorgehen, wenn aus:

Zitat

A -> 1, 2, 3, 4, 5
B -> 1, 2, 3, 4


das werden soll:

Zitat

A,B -> 1, 2, 3, 4
B -> 5



Vielen Dank im Voraus!

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 23. Juli 2011 - 13:17

Beitrag anzeigenZitat (K050V4: 22. Juli 2011 - 20:35)

Gegeben ist folgendes:

Zitat

A -> 1, 2, 3
B -> 1, 2, 6
C -> 1, 6, 7, 2


Ich möchte daraus das machen:

Zitat

1 -> A, B, C
2 -> C
3 -> A
6 -> B, C
7 -> A, B, C

Müßte es nicht so aussehen?

Zitat

1 -> A, B, C
2 -> A, B, C
3 -> A
6 -> B, C
7 -> C




Beitrag anzeigenZitat (K050V4: 22. Juli 2011 - 20:35)

Wie muss ich weiter vorgehen, wenn aus:

Zitat

A -> 1, 2, 3, 4, 5
B -> 1, 2, 3, 4


das werden soll:

Zitat

A,B -> 1, 2, 3, 4
B -> 5

Dazu müßtest Du etwas konkreter werden. Was soll z.B. aus dem hier werden?

Zitat

A -> 1, 2, 3, 4, 5
B -> 1, 2, 3, 4
C -> 1, 5
D -> 1


Es geht ja offensichtlich um Schnittmengen. Geht es um einen möglichst großen gemeinsamen Definitionsbereich:

Zitat

A,B,C,D -> 1
A,B -> 1, 2, 3, 4
A,C -> 1,5

oder den Wertebereich?

Zitat

A,B -> 1, 2, 3, 4
A,C -> 1, 5
D -> 1

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 23. Juli 2011 - 13:56

0

#3 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

geschrieben 26. Juli 2011 - 07:47

@ Mr. Floppy

Du hast Recht, sorry habe da was durcheinander gebracht.

Ich möchte den größtmöglichen gemeinsamen Wertebereich, aber habe keine Idee wie ich da anfangen soll das anzugehen...

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

#4 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 27. Juli 2011 - 17:09

Okay, dann bleibt noch die Frage was aus folgendem werden soll?

Zitat

A -> 1, 2, 3, 4, 5, 6
B -> 1, 2, 3, 4, 5
C -> 2, 3, 4, 5, 6
D -> 1, 2, 3, 4
E -> 2, 3

Da gibt es gleich mehrere gleichgroße Schnittmengen und der Rest ist seinerseits wieder eine Teilmenge... Vielleicht könntest Du die Aufgabe mal ganz genau definieren. Was erwartest Du als Ergebnis und gibt es evtl. ein praktisches Problem, welches Du damit lösen willst?
0

#5 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

geschrieben 06. August 2011 - 14:18

Danke Mr. Floppy. Ich habe eine Lösung gefunden.

Falls es jemanden interessiert oder es jemand braucht:

<?php

/**
 * Description of Intersection
 */
class Intersection
{
    /**
     *
     * @param array $array
     * @return array
     */
    public static function getCrossTable(array $array) {
        $intersections = array();

        foreach ($array as $k1 => $v1) {
            foreach ($array as $k2 => $v2) {
                $intersections[$k1][$k2] = array_intersect($v1, $v2);
            }
        }

        return $intersections;
    }

    /**
     *
     * @param array $array
     * @return array
     */
    public static function intersect(array $array) {
        $inter = array();

        foreach (self::getCrossTable($array) as $name => $others) {
            $same = array($name);

            foreach ($others as $nameOfOther => $other) {
                if ($name != $nameOfOther && array_diff($array[$name], $other) == false) {
                    $same[] = $nameOfOther;
                }
            }

            if (count($same) > 1) {
                $inter[] = $same;
            }
        }

        // finding duplicates and remove them
        foreach ($inter as $index => $value) {
            if (!is_array($value))
                continue;

            foreach ($inter as $indexLevel2 => $valueLevel2) {
                if ($index != $indexLevel2 && array_diff($value, $valueLevel2) == FALSE) {
                    unset($inter[$index]);
                }
            }
        }

        return $inter;
    }

    /**
     *
     * @param array $intersectArray
     * @param array $arrayWithValues
     * @return array
     */
    public static function combine(array $intersectArray, array $arrayWithValues) {
        $data = array();

        foreach ($intersectArray as $items) {
            $group = array();

            foreach ($arrayWithValues as $key => $value) {
                if (in_array($key, $items)) {
                    $group[$key] = $value;
                }
            }

            if (count($group)) {
                $data[] = array(
                    'keys' => $items,
                    'values' => call_user_func_array('array_intersect', $group)
                );
            }
        }

        return $data;
    }
}

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0