Сравняване на елементи в масив.

hrischo

Registered
Здравейте, трябва ми малко пощом със сравняване на елементите в масив. Имам следното нещо:
PHP:
Array ( 
[0] => Array ( [id] => 121 [lvl] => 0 [pfm] => ) 
[1] => Array ( [id] => 120 [lvl] => 1 [pfm] => 0.50 ) 
[2] => Array ( [id] => 119 [lvl] => 1 [pfm] => 0.50 )
[3] => Array ( [id] => 76 [lvl] => 3 [pfm] => 1.10 )
[4] => Array ( [id] => 50 [lvl] => 3 [pfm] => 1.10 ) 
)

Трябва да проверя дали има разлика в нивата( lvl ) на всеки 2 съседни елемента в масива и ако има, да запише в нов масив тези, тези които са с по-голям lvl.

Крайния резултат от това, трябва да бъде следния:

PHP:
Array ( 
[0] => Array ( [id] => 120 [lvl] => 1 [pfm] => 0.50 ) 
[1] => Array ( [id] => 76 [lvl] => 3 [pfm] => 1.10 )
)

Задължително проверката трябва да бъде дали втория елемент е по-голям от първия и така докато се проверят всички. Ако има нещо неясно, ще обясня допълнително.
 
Задължително говорим само за поредни елементи? Ако съм разбрал правилно, при положение, че имаш такъв вход:
PHP:
Array(
   [0] => Array( [id] => 121 [lvl] => 0 [pfm] => 2 )
   [1] => Array( [id] => 120 [lvl] => 1 [pfm] => 5 )
   [2] => Array( [id] => 119 [lvl] => 0 [pfm] => 3 )
)
когато първия и третия елемент са на lvl 0, но не са съседни, в изхода трябва да присъстват и двата? Т.е. масива не трябва да се промени по никакъв начин?

Вторият ми въпрос е - какво разбираш под:
...дали втория елемент е по-голям от първия...
как определяш кой елемент е по-голям? По lvl, id или pfm?
 
Да, задължително само за поредни елементи. Това включва сравнение на: [0] и [1], [1] и [2], [2] и [3], [3] и [4] и т.н.


За втория въпрос, определям по lvl, кой е по-голям.

В примера, който си дал, трябва да остане единствено това : [1] => Array( [id] => 120 [lvl] => 1 [pfm] => 5 ) .

Защото има разлика между [0] и [1] ( lvl [1] > lvl [0] ). Такава разлика има и при [1] и [2], но там е обратно ( [2] < [1]) и не трябва да присъства в крайния резултат.
 
Добре, в първия пример, който даде, последните два реда са:
PHP:
[3] => Array ( [id] => 76 [lvl] => 3 [pfm] => 1.10 )
[4] => Array ( [id] => 50 [lvl] => 3 [pfm] => 1.10 )
Защо в крайния резултат присъства само първия от тях? Нали сравняваш само lvl, а двата реда имат еднаква стойност?
 
Сега ще се опитам да покажа по-обстойно какво се случва.

сравняване на [0] и [1] : ако lvl [1] е по-голям от lvl [0] - записват се данните за [1] в нов масив. В случая условието E изпълнено и това е първия елемент на новия масив.

сравняване на [1] и [2] : ако lvl [2] е по-голям от lvl [1] отново трябва да се запише в новия масив. В случая това условие НЕ е изпълнено, затова се пропуска.


сравняване на [2] и [3] : ако lvl [3] е по-голям от lvl [2] - записват се данните за [3] в нов масив. В случая условието E изпълнено и това е втория елемент на новия масив.

сравняване на [3] и [4] : ако lvl [4] е по-голям от lvl [3] отново трябва да се запише в новия масив. В случая това условие НЕ е изпълнено, затова се пропуска.



И затова в крайна сметка остават само [1] и [3].
 
Това може би:
PHP:
<?php
    $data = array(
        array ( 'id' => 121, 'lvl' => 0, 'pfm' => null ),
        array ( 'id' => 120, 'lvl' => 1, 'pfm' => 0.50 ),
        array ( 'id' => 119, 'lvl' => 1, 'pfm' => 0.50 ),
        array ( 'id' => 76, 'lvl' => 3, 'pfm' => 1.10 ),
        array ( 'id' => 50, 'lvl' => 3, 'pfm' => 1.10 )
    );

    function lvl_extract( $data ) {
        $result = array();
        $c      = count( $data ) - 1;

        if( $c < 1 )
            return $data;

        for( $i = 0; $i < $c; $i++ ) {
            if( $data[$i+1]['lvl'] > $data[$i]['lvl'] ) {
                array_push( $result, $data[$i+1] );
            }
        }

        return $result;
    }

    print '<pre>';
        var_dump( lvl_extract( $data ) );
    print '</pre>';
?>

но сигурно ще трябва да си отработиш какво се случва, когато масива има 0 или 1 елемента. В случая аз връщам оригиналния масив, но ти може да върнеш null или празен масив.
 
Мисля, че е точно това, което ми трябва. Тази вечер нямам много време да тествам всичките възможности, но до някаква степен се убедих, че ще върши идеално работа. Мерси
 

Back
Горе