Помогите с PHP кодом

D
На сайте с 28.06.2008
Offline
1104
340

Сижу второй день и понимаю что сам не осилю.

Есть json такого вида 

Он создает такое дерево

Мне нужно записать позиции, у которых есть "Продукт №" (partnumber) и поле  showpartnumber is true.

Так же нужно записывать позицию детали на чертеже - positionnumber.

И вот тут самая сложность - помимо всего этого ветвям дерева нужно записывать positionnumber  позиций которые в него входят.

Например  "Комплект, шариковый подшипник" - 111, 111, 157, 158.

Вот что я наговнокодил за 2 дня

//последний json с инфой о запчасти
$url4 = "https://product-selection-classic.grundfos.com/product-detail.service.parts.json?frequency=50&languagecode=RUS&productrange=gma&searchdomain=SALEABLE&version=1.71.01&unitsystem=4&pumpsystemid=$pumpsystemid2&date=$date&listtype=K";
$json4 = json_decode(file_get_contents($url4), true);
//первый уровень дерева
            if(!empty($json4['parts'])){
                for($i=0;$i<count($json4['parts']);$i++){
                    $listPosition = '';
                    //описание детали
                    $description = '';
                    $description = $json4['parts'][$i]['description'];
                    //Номер детали
                    $numDetal = '';
                    $numDetal = $json4['parts'][$i]['partnumber'];
                    //Номер позиции
                    $positionNumber = '';
                    $positionNumber = $json4['parts'][$i]['positionnumber'];
                    $listPosition .= $positionNumber.',';
                    if(!empty($json4['parts'][$i]['parts'])){
                        //проходимся по всему дереву
                        $listPosition = goToParts($json4['parts'][$i]['parts'], $nameModel, $numModel, $conn, $listPosition);
                    }

                    $listPosition = preg_replace('~,$~m', '',$listPosition);
                    $listPosition =trim( preg_replace('~^,~m', '',$listPosition));
                        $sql = ("INSERT INTO `zapchasti` (`id`, `Номер модели`, `Наименование модели`, `Позиция`, `Номер детали`, `Описание`) 
                VALUES (NULL, '{$numModel}', '{$nameModel}','{$listPosition}', '{$numDetal}','{$description}');");
                      $conn->query($sql);
                }
            }

/////ну и вверху кода вот эта функция
function goToParts($array, $nameModel, $numModel, $conn, &$listPosition){
    foreach ($array as $value){
        //описание детали
        $description = '';
        $description = $value['description'];
        //Номер детали
        $numDetal = '';
        $numDetal = $value['partnumber'];
        //Номер позиции
        $positionNumber = '';
        $positionNumber = $value['positionnumber'];
        $showpartNumber = false;
        $showpartNumber = $value['showpartnumber'];
        if(!empty($positionNumber)){
            $listPosition .= $positionNumber.',';
        }

        if(!empty($value['parts'])){
            $listPosition = '';
            goToParts($value['parts'], $nameModel, $numModel, $conn, $listPosition);
        }
        if(!empty($numDetal) && $showpartNumber){
            var_dump($value['description'].'-'.$value['partnumber'].'-'.$listPosition);
            if(empty($positionNumber)){
                $positionNumber = $listPosition;
            }
            $positionNumber = preg_replace('~,$~m', '',$positionNumber);
            $sql = ("INSERT INTO `zapchasti` (`id`, `Номер модели`, `Наименование модели`, `Позиция`, `Номер детали`, `Описание`) 
                VALUES (NULL, '{$numModel}', '{$nameModel}','{$positionNumber}', '{$numDetal}','{$description}');");
            if(!empty($sql)){
                $conn->query($sql);
            }
        }
    }
    return $listPosition;

}

В итоге получается почти то что мне нужно, но не собираются позиции у ветвей дерева, если там вложенность более 1 увроня (например Электродвигатель)

Все больше мой мозХ не варит, прошу помощи!



S
На сайте с 13.10.2014
Offline
171
#1

Перепишите  ваш код в функцию и дергайте его для каждой обнаруженной ветви.
или используйте array_walk_recursive

Если я правильно понял вопрос.

Обычная рекурсия.


а.. да...

вот так

 for($i=0;$i<count($json4['parts']);$i++){

никогда не делайте, потому, что при каждой итерации вызывается функция count. а она вовсе не бесплатная

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий