Sortierung konvertieren

Bekanntlich kann man die Instanzen sortieren durch natürliche Zahlen. Bei gleichen Zahlen ist das Ergebnis kompliziert.

Schön wäre es, wenn es eine Funktion geben würde, welche die Zahlenreihe automatisch „vereinfacht“. Aus der Zahlenreichen 0, 4, 4, 5,7,9 wird 10, 20, 30, 40, 50, 60 ,70. (Konkret 5 wird zu 50, zweite 4 zu 40, 9 zu 70).Dies ermöglicht danach eine weitere Umordnung ohne viel Mehraufwand.

$kinder = IPS_GetChildrenIDs($parentID);
foreach($kinder as $kind){
 $altePos = IPS_GetObject($kind)['ObjectPosition'];
 $neuePos = $altePos*10;
 IPS_SetPosition($kind, $neuePos);
}

Der o.a. Code ist NICHT getestet. Soll nur als Anhaltspunkt dienen.

1 „Gefällt mir“

Wir haben es noch aufm Schirm, dass wir die Sortierung GUI-seitig mal vereinfachen wollen (ohne unseren Profis die vielen tollen Möglichkeiten zu nehmen). Aktuell haben wir allerdings andere Baustellen, das wird also nichts kurzfristiges…

Ich habe wieder einmal gespielt mit Erweiterungen. Dabei widmete ich mich diesem Sortierwunsch. Dank ch…t ist es mir gelungen, ein Skript zu generieren. Ich habe es aber nicht auf dem Root ausgeführt. Man muss es separate für jedes Stockwerk machen. Zur Illustration könnte man die Variable $testMode=true; setzen.

<?php

/*********************************************************

 * IP-Symcon – Rekursive Positions-Normalisierung

 *

 * - Reihenfolge bleibt wie aktuell (stabil!)

 * - Positionen werden harmonisiert: 10,20,30,...

 * - Rekursiv für alle Ebenen

 * - Testmodus

 *********************************************************/




/*************** KONFIGURATION ***************************/

$parentID = 38678;   // Startobjekt

$startPos = 10;      // Erste Position (nie 0!)

$step     = 10;      // Abstand

$testMode = false;    // true = nur anzeigen, false = wirklich ändern

/*********************************************************/




function NormalizePositionsStable($parentID, $startPos, $step, $level = 0, $testMode = true)

{

    $childrenIDs = IPS_GetChildrenIDs($parentID);




    // Snapshot mit stabiler Reihenfolge bauen:

    // Primär: aktuelle ObjectPosition (wie Baum i.d.R. sortiert)

    // Sekundär: Original-Index (stabil bei gleichen Positionen)

    $snapshot = [];

    foreach ($childrenIDs as $idx => $id) {

        $o = IPS_GetObject($id);

        $snapshot[] = [

            'id'   => $id,

            'idx'  => $idx, // stabiler Tie-Breaker

            'pos'  => (int)$o['ObjectPosition'],

            'name' => $o['ObjectName'],

            'type' => $o['ObjectType'],

        ];

    }




    usort($snapshot, function($a, $b) {

        if ($a['pos'] === $b['pos']) {

            return $a['idx'] <=> $b['idx']; // stabil bei gleicher Position

        }

        return $a['pos'] <=> $b['pos'];     // wie im Baum (Position aufsteigend)

    });




    $indent = str_repeat("  ", $level);

    $pos = $startPos;




    foreach ($snapshot as $entry) {

        $id = $entry['id'];

        $o  = IPS_GetObject($id);




        if ($testMode) {

            echo $indent .

                "{$o['ObjectName']} (ID {$id}, Typ {$o['ObjectType']}) " .

                "Alt={$o['ObjectPosition']} → Neu={$pos}\n";

        } else {

            IPS_SetPosition($id, $pos);

        }




        // Rekursion für alle Ebenen

        $grandChildren = IPS_GetChildrenIDs($id);

        if (!empty($grandChildren)) {

            NormalizePositionsStable($id, $startPos, $step, $level + 1, $testMode);

        }




        $pos += $step;

    }

}




/*************** START ***********************************/

NormalizePositionsStable($parentID, $startPos, $step, 0, $testMode);




if ($testMode) {

    echo "\nTESTMODUS: Keine Positionen wurden geändert.\n";

    echo "Wenn alles gut aussieht → \$testMode = false setzen.\n";

} else {

    echo "\nFERTIG: Alle Positionen wurden neu gesetzt.\n";

}

?>