Переписать массив PHP при удалении определенной строки - PullRequest
0 голосов
/ 31 октября 2019

У меня есть задача переписать массив, сгруппировав его по значению и сохранив только максимум каждой группы

в этом примере в режиме онлайн http://sandbox.onlinephpfunctions.com/code/231f73be712de42964c1daf96d05789391b8f5ee

и здесь желаемый результат (группапо столбцу APP и сохранить только самый высокий IdProject)

Ожидаемый результат:

 array (size=5)
  0 => 
    array (size=4)
      0 => string '16129' (length=5)
      1 => string '14950' (length=5)
      2 => string '14950_APP1' (length=10)
      3 => string 'TEST 01' (length=7)
  1 => 
    array (size=4)
      0 => string '16200' (length=5)
      1 => string '15600' (length=5)
      2 => string '15600_APP2' (length=10)
      3 => string 'TEST 02' (length=7)
  2 => 
    array (size=4)
      0 => string '18000' (length=5)
      1 => string '15700' (length=5)
      2 => string '15700_APP3' (length=10)
      3 => string 'TEST 03' (length=7)

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Я думаю, что вы просите оставить только самую большую строку project_id для каждого совпадения дублированных App кодов. Это будет сделано.

<?php
$array = array ( 
        array ( 'Project_id', 'Id_autre', 'App', 'App_lib'), 
        array ( '15685', '14950', '14950_APP1', 'TEST 01'), 
        array ( '16129', '14950', '14950_APP1', 'TEST 01'),
// added extra 15600_APP2 with largest Project_id first in the array
        array ( '16300', '15600', '15600_APP2', 'TEST 02'),   
        array ( '16100', '15600', '15600_APP2', 'TEST 02'),
        array ( '16200', '15600', '15600_APP2', 'TEST 02'),
        array ( '18000', '15700', '15700_APP3', 'TEST 03')
    );

function sortOnAppandProjectId($a,$b)
{
    return  $a[2] > $b[2] ||
            ($a[2] == $b[2] && $a[0] > $b[0]);
}

// lose the Column name occurance
unset($array[0]);   
// sort the array
usort($array, "sortOnAppandProjectId");

foreach( $array as $key => $value ){
    if ( $key < count($array)-1         && 
         $value[2] == $array[$key+1][2] &&
         $value[0] < $array[$key+1][0]) { 
            continue; 
    }  // got another one loose this line
    $arr[] = $value;
}
echo 'RESULT'.PHP_EOL;
print_r($arr);

РЕЗУЛЬТАТ

Array
(
    [0] => Array
        (
            [0] => 16129
            [1] => 14950
            [2] => 14950_APP1
            [3] => TEST 01
        )

    [1] => Array
        (
            [0] => 16300
            [1] => 15600
            [2] => 15600_APP2
            [3] => TEST 02
        )

    [2] => Array
        (
            [0] => 18000
            [1] => 15700
            [2] => 15700_APP3
            [3] => TEST 03
        )

)

http://sandbox.onlinephpfunctions.com/code/9ce5178a0b3cd2822cb7e8f8d30e39d7c3db6701

1 голос
/ 31 октября 2019

вы можете использовать это, как показано здесь, и изменить его PHP.net array_unique

<?php

$array = array ( 
        0 => array ( 
                 0 => 'Project_id', 
                 1 => 'Id_autre', 
                 2 => 'App', 
                 3 => 'App_lib', 
             ), 
        1 => array ( 
                0 => '15685', 
                1 => '14950', 
                2 => '14950_APP1', 
                3 => 'TEST 01', 
            ), 
        2 => array ( 
                0 => '16129',
                1 => '14950', 
                2 => '14950_APP1', 
                3 => 'TEST 01', 
             ),
        3 => array ( 
                0 => '16100',
                1 => '15600', 
                2 => '15600_APP2', 
                3 => 'TEST 02', 
             ),
        4 => array ( 
                0 => '16200',
                1 => '15600', 
                2 => '15600_APP2', 
                3 => 'TEST 02', 
             ),
        5 => array ( 
                0 => '18000',
                1 => '15700', 
                2 => '15700_APP3', 
                3 => 'TEST 03', 
             ),
    );


function unique_multidim_array($array, $key) {
    $temp_array = array();
    $i = 0;
    $key_array = array();

    foreach($array as $val) {
        // Do a check if the value is_numeric
        if(is_numeric($val[0])){
            // Search array in $key_array if doenst exists add
            if (!array_search($val[$key], $key_array)) {
                $key_array[$i] = $val[$key];
                $temp_array[$i] = $val;
            } else {
                // Search array and if it does exists replace the array.
                $key_array[array_search($val[$key], $key_array)] = $val[$key];
                $temp_array[array_search($val[$key], $key_array)] = $val;
            }
        }
        $i++;
    }
    return $temp_array;
}

$details = unique_multidim_array($array,3);
print_r($details);

Живой пример 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...