PHP Создание подмассивов из мастер-массива на основе ключей - PullRequest
0 голосов
/ 07 января 2020

Это относится к PHP. У меня есть массив массивов, который является набором записей из запроса базы данных:

Array
(
    [0] => Array
        (
            [0] => Amazon
            [1] => AmazonSendTracking
            [2] => 
            [3] => 1
            [4] => IN
            [5] => 2020-01-07 11:32:18
            [6] => 7
            [7] => 5
        )

    [1] => Array
        (
            [0] => Amazon
            [1] => AmazonGetOrdersAndMove
            [2] => 
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 6
            [7] => 4
        )

    [2] => Array
        (
            [0] => Test
            [1] => RedirectTest1
            [2] => data=data1&data2=data2&testvar=testvariable
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 17
        )

    [3] => Array
        (
            [0] => Test
            [1] => RedirectTest2
            [2] => data=value&data2=value2&testvar=value3
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 25
        )

    [4] => Array
        (
            [0] => Amazon
            [1] => AmazonPushInventory
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 26
        )

    [5] => Array
        (
            [0] => Amazon
            [1] => CalculateFloorCeiling
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 27
        )

    [6] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXML
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 28
        )

    [7] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXMLResetBusinessAndFlipEm
            [2] => 
            [3] => 1440
            [4] => OUT
            [5] => 
            [6] => 8
            [7] => 6
        )

)

Значение в 7-й позиции (6) подмассива представляет "группу", в которую я хочу разбить отдельные массивы.

Итак, я хочу, чтобы вышеупомянутое стало одним массивом элементов, не входящих в какую-либо группу, а затем новым массивом для каждой группы, например:

Array1 - все элементы, не входящие в группа

Array1
(
    [0] => Array
        (
            [0] => Amazon
            [1] => AmazonSendTracking
            [2] => 
            [3] => 1
            [4] => IN
            [5] => 2020-01-07 11:32:18
            [6] => 7
            [7] => 5
        )

    [1] => Array
        (
            [0] => Amazon
            [1] => AmazonGetOrdersAndMove
            [2] => 
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 6
            [7] => 4
        )
    [2] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXMLResetBusinessAndFlipEm
            [2] => 
            [3] => 1440
            [4] => OUT
            [5] => 
            [6] => 8
            [7] => 6
        )
)

Array2 - 1-я группа

Array2(
 [0] => Array
        (
            [0] => Test
            [1] => RedirectTest1
            [2] => data=data1&data2=data2&testvar=testvariable
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 17
        )

    [1] => Array
        (
            [0] => Test
            [1] => RedirectTest2
            [2] => data=value&data2=value2&testvar=value3
            [3] => 4
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 19
            [7] => 25
        )
)

Array3 - 2-я группа

Array3(
    [0] => Array
        (
            [0] => Amazon
            [1] => AmazonPushInventory
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 26
        )

    [1] => Array
        (
            [0] => Amazon
            [1] => CalculateFloorCeiling
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 27
        )

    [2] => Array
        (
            [0] => Amazon
            [1] => AmazonSubmitPricingXML
            [2] => 
            [3] => 15
            [4] => ALL
            [5] => 2020-01-07 11:32:18
            [6] => 27
            [7] => 28
        )
)

Я просто не уверен, какие функции массива лучше всего использовать для выполнения sh. Я попытался получить счет каждой группы, используя следующее. У меня есть al oop, который проходит через мастер-массив (массив массивов вызывает $ rs), и, находясь в l oop, я вытаскиваю седьмую позицию в переменную с именем $ HeaderRecNbr и затем делаю это:

$GroupCount=array_count_values(array_column($rs, 6))[$HeaderRecNbr];

но я не уверен, куда go отсюда.

Ответы [ 3 ]

1 голос
/ 07 января 2020

Просто создайте массив, проиндексированный группой из индекса 6. Это создаст подмассив для каждой группы, проиндексированной номером группы:

foreach($array as $v) {
    $groups[$v[6]][] = $v;
}

Затем, чтобы получить элементы, которые находятся отдельно в group, проверьте, существует ли ровно один вложенный массив, и добавьте его в другой массив. Затем удалите его из группового массива:

foreach($groups as $k => $v) {
    if(count($v) == 1) {
        $other[] = $v;  // or $other[$v[0][6]][] = $v;
        unset($groups[$k]);
    }
}
0 голосов
/ 07 января 2020

Эта функция сгруппирует их по нужному индексу, затем объединит те, которые не имеют других с таким же индексом, и вернет массив массивов, не сгруппированных, а затем все сгруппированные.

function sortByIndex( $data, $index ) {
    $sortedData = array();
    $ungroupedData = array();
    // Make sure you can loop through
    if ( ! is_array( $data ) ) {
        return FALSE;
    }
    foreach ( $data as $key => $arrayToInspect ) {
        if ( ! isset( $sortedData[$arrayToInspect[$index]] ) ) {
            $sortedData[$arrayToInspect[$index]] = array();
        }
        $sortedData[$arrayToInspect[$index]][] = $arrayToInspect;
    }

    // Combine as desired
    foreach ( $sortedData as $groupId => $data ) {
        if ( count( $data ) < 2 ) {
            $ungroupedData[] = $data;
            unset( $sortedData[$groupId] );
        }
    }
    return ( array_merge( [ $ungroupedData ], array_values( $sortedData ) ) );
}
0 голосов
/ 07 января 2020
    $mainArray = ... all rows variable here..
$groupedArray = [];
$countArray = [];
foreach ($mainArray as $k => $v) {
    $groupedArray[$v[6]][] = $v;
    $countArray[$v[6]]++;
}
$singleItems = [];
$multipleItems = [];
foreach ($groupedArray as $k => $v) {
    if ($countArray[$k] > 1) $multipleItems[] = $v;
    else $singleItems = $v;
}

... do something with single and multi - groups...

1: начать с группировки всех элементов в группах по 6-му элементу подмассива ... вести подсчет их одновременно 2. Разделить группы из одного и нескольких элементов в 2 массива ... 3. Делать все, что угодно вам нужно с группами из нескольких предметов.

...