Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Gruppierung mal anders [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Gruppierung mal anders


 
Postaria
05-03-2010, 12:12 
 
Hallo Community,

mir wurde hier schon des öffteren geholfen, deshalb möchte ich mich auch als erstes hier melden.

z.Z stehe ich vor einer Aufgabe die wie folgt aussieht.

Ein Benutzer gibt tausende wahllos ausgedachte ID's in ein Array ein.
Alle ID's sind nummerisch.

Nun habe ich also ein Array sagen wir in der Form

array(
[id] [Values]
'1' => '1000',
'2' => '1023',
'3' => '1011',
'4' => '1990',
'5' => '1561',
'6' => '5',
'7' => '800',
'8' => '3000',
'9' => '999456',
'10' => '30',
.... usw.
);


Ich möchte nun die Values des Arrays [Values] Gruppieren.

Jetzt weiß ich ja nicht von vornherein welche Bereiche der Nummern der Benutzer abgedeckt hat.
In etwa so : 0 -1000 , 1001 - 2000 , 2001 - 3000 usw.

Also möchte ich ähnliche Values mit einander Gruppieren.
in etwa nach dem obigen Beispiel Array
müsste ich eine Gruppierung haben :

Gruppe 1 = 5
Gruppe 2 = 1000,1023,1011,1990
Gruppe 3 = 800
Gruppe 4 = 3000
Gruppe 5 = 999456
Gruppe 6 = 30
usw.

Irgendwie fehlt mir der Bezug zu den Bereichen der Zahlen wie ich die Einträge in Gruppen definiere.


Ich bräuchte also in etwa einen Denkanstoß.

Wenn Ihr fragen habt dann fragt bitte.
Hoffe ich war einwenig verständlich.

LG
Postaria

 
TobiaZ
05-03-2010, 14:31 
 
Dekanstoß hört sich erstmal nach Brainstorming an.

Das Problem was du hast ist zudem weniger die Umsetzung, als das logische Konzept, welches dir z.Zt. noch fehlt.

Wenn du uns keinen Algorithmus nennen kannst, nach dem du die Werte sortiert haben willst, wird es schwierig.

In meinen Augen ist dein Beispiel schon total verkorkst.

Erklär mir doch mal bitte, warum 5, 30 und 800 jeweils eine eigene Gruppe bilden, 1000,1011,1023 und 1990 aber gemeinsam in einer Gruppe landen?

Also, du musst erstmal wissen, was du willst.

Vielleicht kommst du eher drauf, wenn du dein vorhaben mal genauer und weniger abstrakt bezeichnest.

 
AmicaNoctis
05-03-2010, 15:30 
 
Hallo,

hier eine Lösung, welche auch mit assoziativen Arrays umgehen kann, ohne die Zuordnungen zu zerstören:


function groupValues (array $pValues) {
asort($pValues);
$deltas = array();
$last = null;
foreach ($pValues as $k => $v) {
if (!is_null($last) && $v - $pValues[$last] > 0) { // EDIT
$deltas[] = $v - $pValues[$last];
}
$last = $k;
}
$delta = .0001 * ceil(10000 * array_sum(array_map("log", $deltas)) / count($deltas)); // EDIT
$result = array();
$current = array();
$last = null;
foreach ($pValues as $k => $v) {
if (!is_null($last) && log($v - $pValues[$last]) > $delta) {
$result[min($current) . ".." . max($current)] = $current;
$current = array();
}
$current[$k] = $v;
$last = $k;
}
if ($current) {
$result[min($current) . ".." . max($current)] = $current;
}
return $result;
}


Da kommt zwar eine andere Gruppierung raus als die vorgegebene, aber vielleicht passt es ja trotzdem.

Gruß,

Amica

 
Postaria
05-03-2010, 15:51 
 
Edit : Oh sehe gerade ich habe zu lange geschrieben :/ mal die Funktion ausprobieren.



Genau da liegt ja auch der Hund begraben. :)

Die oben genannte Lösung habe ich mir getreu dem Motto ähnliches zu ähnlichen zusammengeschustert.

also
Gruppe 1: 0-10 -- 10er Gruppe
Gruppe 2: 1.000 - 1.999 -- 1000er Gruppe
Gruppe 3: 100 - 999 -- 100er Gruppe weil (Gruppe 6 Existieren wird)
Gruppe 4: 3.000 - 3.999 -- wie Gruppe 2
Gruppe 5: 100.000 - 999.999 -- 100.000er Gruppe
Gruppe 6: 10 - 99 -- 10er Gruppe wegen Gruppe 1

Naja ich kam halt auf die Gruppierung weil der Benutzer sich das Array anzeigen kann und halt bei mehreren tausend Einträgen würde das Ergebniss elendig lang sein. Kann es halt über eine maximale Ausgabe der Einträge zwar Seitenweise ausgabe der Ergebnisse steuern, will dies anweden wenn die Gruppierung nicht geht.

Also wie du ja schon sagtest fehlt mir das Konzept für die Gruppen zuweisung.

Ich könnte was mir jetzt gerade einfällt die Stellen zählen lassen und diese jeweils Gruppieren. Sprich 10er 100er 1.000er 100.000er.
Was aber naja zumindestens bei den Gruppen ab 100 ja schon viel wird zum anzeigen.


Also irgendwie möchte ich halt dem Benutzer langen Listen ersparen die er ggf. angezeigt bekommen wird.

LG

Postaria

 
AmicaNoctis
05-03-2010, 15:54 
 
Wäre cool, wenn du dich noch zu meiner Lösung äußern könntest...

Edit: achso, hat sich erledigt ;)

 
TobiaZ
05-03-2010, 16:33 
 
Irgendwie höre ich als einziges Problem die Größe der Gruppen heraus?

Also Anzahl aller Zahlen / Max. Größe pro Gruppe = Anzahl Gruppen.

Nicht schön, aber dein Problem gelöst.

Wenn nicht, dann solltest du wie gesagt konkreter werden.

 
Postaria
05-03-2010, 16:43 
 
Richtig das Problem vorerst gelöst !:danke:
AmicaNoctis ich Danke dir.

und ja TobiaZ über die delta variable bin ich auch gestolpert :)

Aber die Ausgabe ist soweit ganz gut und der Benutzer kann nun die Anzeige Gruppenweise anschauen.

aber auf die Idee wär ich warscheinlich nicht selber gekommen.


Ich danke euch beiden.

Falls ich die Funktion einwenig anpasse lasse ich es euch wissen.


LG

Postaria

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:14 Uhr.