N
N
NinjaSystems2021-07-09 14:48:52
PHP
NinjaSystems, 2021-07-09 14:48:52

How to implement such CSV processing?

An example of a source CSV file looks like this:

Продукт 1; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 3; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 4; Воздуховоды/Круглые/Нержавеющие;
Продукт 5; Воздуховоды/Круглые/Нержавеющие;
Продукт 6; Воздуховоды/Круглые/Нержавеющие;


Can you tell me how to process to get such a result?
Воздуховоды;
!Прямоугольные;
!!Оцинкованные;
Продукт 1; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 3; Воздуховоды/Прямоугольные/Оцинкованные;
!Круглые;
!!Нержавеющие;
Продукт 4; Воздуховоды/Круглые/Нержавеющие;
Продукт 5; Воздуховоды/Круглые/Нержавеющие;
Продукт 6; Воздуховоды/Круглые/Нержавеющие;


That is, from each next line, the script checks the previous array, and if the categories differ, then it adds a category before the product name. Symbol "!" means nested category level. In which direction to step, tell me.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
N
N, 2021-07-10
@NinjaSystems

Here is an option that will work for any order of categories...
Optimizing/shortening the code is up to you :)

<?php

$TEST_DATA = 'Продукт 1; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 3; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 4; Воздуховоды/Круглые/Нержавеющие;
Продукт 5; Воздуховоды/Круглые/Нержавеющие;
Продукт 6; Воздуховоды/Круглые/Нержавеющие;';

$TEST_DATA2 = 'Продукт 1; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2; Воздуховоды/Круглые/Нержавеющие;
Продукт 3; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 4; Воздуховоды/Круглые/Нержавеющие;
Продукт 5; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 6; Воздуховоды/Круглые/Нержавеющие;';

$arData = array_map(function($val) {
    return array_filter(array_map('trim', explode(';', $val)));
}, preg_split('#[\r\n]#isu', $TEST_DATA, -1, PREG_SPLIT_NO_EMPTY));

/* Всё, что выше - к задаче не относится...имитация получения данных из CSV... */

$arRes = [];

foreach($arData as $data) {
    
    $arCategories = array_filter(array_map('trim', explode('/', $data[1])));
    
    $MAIN_CATEGORY = array_shift($arCategories);
    
    $HASH = md5(implode('/', $arCategories));
    
    $arRes[$MAIN_CATEGORY][$HASH][] = [
            'product_name' => $data[0],
            'category' => $data[1],
            'category_items' => $arCategories
        ];
    
}

$HASH = false;

foreach($arRes as $main_category => $arSubCategories) {
    
    echo $main_category."\r\n";
    
    foreach($arSubCategories as $h => $arItems)
        foreach($arItems as $item) {
            
            if($HASH != $h) {
                
                $HASH = $h;
                
                foreach($item['category_items'] as $k => $category) {
                
                    $k++;
                        
                    echo str_repeat('!', $k).$category."\r\n";
                
                }
                
            }
            
            echo $item['product_name'].';'.$item['category'].';'."\r\n";
            
        }
    
}

/* RESULT:

Воздуховоды
!Прямоугольные
!!Оцинкованные
Продукт 1;Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2;Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 3;Воздуховоды/Прямоугольные/Оцинкованные;
!Круглые
!!Нержавеющие
Продукт 4;Воздуховоды/Круглые/Нержавеющие;
Продукт 5;Воздуховоды/Круглые/Нержавеющие;
Продукт 6;Воздуховоды/Круглые/Нержавеющие;

*/

UPD:
Option with one cycle , taking into account the fact that the categories are already sorted :
<?php

$TEST_DATA = 'Продукт 1; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 3; Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 4; Воздуховоды/Круглые/Нержавеющие;
Продукт 5; Воздуховоды/Круглые/Нержавеющие;
Продукт 6; Воздуховоды/Круглые/Нержавеющие;';

$arData = array_map(function($val) {
    return array_filter(array_map('trim', explode(';', $val)));
}, preg_split('#[\r\n]#isu', $TEST_DATA, -1, PREG_SPLIT_NO_EMPTY));

/* Всё, что выше - к задаче не относится...имитация получения данных из CSV... */

$VAR = false;
$VAR2 = false;

foreach($arData as $data) {
    
    $arCategories = array_filter(array_map('trim', explode('/', $data[1])));
        
    $MAIN_CATEGORY = array_shift($arCategories);
    
    if($VAR !== $MAIN_CATEGORY) {
        
        $VAR = $MAIN_CATEGORY;
        
        echo $MAIN_CATEGORY."\r\n";
        
    }
    
    $CATEGORIES = implode('/', $arCategories);
    
    if($VAR2 !== $CATEGORIES) {
        
        foreach($arCategories as $k => $category) {
                
            $k++;
                
            echo str_repeat('!', $k).$category."\r\n";
                
        }
        
        $VAR2 = $CATEGORIES;
        
    }
    
    echo $data[0].';'.$data[1].';'."\r\n";

}

/* RESULT:

Воздуховоды
!Прямоугольные
!!Оцинкованные
Продукт 1;Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 2;Воздуховоды/Прямоугольные/Оцинкованные;
Продукт 3;Воздуховоды/Прямоугольные/Оцинкованные;
!Круглые
!!Нержавеющие
Продукт 4;Воздуховоды/Круглые/Нержавеющие;
Продукт 5;Воздуховоды/Круглые/Нержавеющие;
Продукт 6;Воздуховоды/Круглые/Нержавеющие;

*/

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question