2017-01-26 1 views
3

Я пытаюсь создать структуру данных, с которой мое приложение может работать, поэтому я могу сопоставить свои категории в системе, чтобы получить структуру торговли. Мне просто нужна иерархия категорий (показано ниже), которая имеет полный путь к категориям с каналом между каждым родителем/дочерним элементом, у которого есть идентификатор дочернего узла категории.Создайте иерархию категорий из woocommerce api products/categories

Я могу легко получить все категории продуктов в WooCommerce со следующим:

$woocommerce = new Client($this->ecommerce_url,$this->ecommerce_api_key,$this->ecommerce_api_cred,array('wp_api' => true,'version' => 'wc/v1')); 

    $send_call = true; 
    $per_page = 30; 
    $categories = array(); 
    $page = 1; 

    $categories = array(); 

    while($send_call == true) 
    { 

     $result_categories = $woocommerce->get('products/categories', array('per_page'=>$per_page, 'page'=>$page,'context' => 'view')); 
     $page++; 
     $categories = array_merge($categories, $result_categories); 

     if(count($result_categories) < $per_page) 
     { 
      $send_call=false; 
     } 

    } 

    $return_woo_categories = array(); 

    foreach($categories as $index => $category) 
    { 
     $return_woo_categories[] = array('name' => $category['name'], 'id' => $category['id'], 'parent' => $category['parent']); 
    } 

var_dump от $ return_woo_categories

array(13) { 
    [0]=> 
    array(3) { 
    ["name"]=> 
    string(1) "/" 
    ["id"]=> 
    int(23) 
    ["parent"]=> 
    int(20) 
    } 
    [1]=> 
    array(3) { 
    ["name"]=> 
    string(1) "+" 
    ["id"]=> 
    int(21) 
    ["parent"]=> 
    int(20) 
    } 
    [2]=> 
    array(3) { 
    ["name"]=> 
    string(6) "Albums" 
    ["id"]=> 
    int(20) 
    ["parent"]=> 
    int(16) 
    } 
    [3]=> 
    array(3) { 
    ["name"]=> 
    string(18) "Castle On The Hill" 
    ["id"]=> 
    int(24) 
    ["parent"]=> 
    int(23) 
    } 
    [4]=> 
    array(3) { 
    ["name"]=> 
    string(8) "Clothing" 
    ["id"]=> 
    int(14) 
    ["parent"]=> 
    int(0) 
    } 
    [5]=> 
    array(3) { 
    ["name"]=> 
    string(7) "Hoodies" 
    ["id"]=> 
    int(15) 
    ["parent"]=> 
    int(14) 
    } 
    [6]=> 
    array(3) { 
    ["name"]=> 
    string(5) "Music" 
    ["id"]=> 
    int(16) 
    ["parent"]=> 
    int(0) 
    } 
    [7]=> 
    array(3) { 
    ["name"]=> 
    string(10) "My New Cat" 
    ["id"]=> 
    int(6) 
    ["parent"]=> 
    int(0) 
    } 
    [8]=> 
    array(3) { 
    ["name"]=> 
    string(7) "Posters" 
    ["id"]=> 
    int(17) 
    ["parent"]=> 
    int(0) 
    } 
    [9]=> 
    array(3) { 
    ["name"]=> 
    string(12) "Shape of You" 
    ["id"]=> 
    int(25) 
    ["parent"]=> 
    int(23) 
    } 
    [10]=> 
    array(3) { 
    ["name"]=> 
    string(7) "Singles" 
    ["id"]=> 
    int(18) 
    ["parent"]=> 
    int(16) 
    } 
    [11]=> 
    array(3) { 
    ["name"]=> 
    string(8) "T-shirts" 
    ["id"]=> 
    int(19) 
    ["parent"]=> 
    int(14) 
    } 
    [12]=> 
    array(3) { 
    ["name"]=> 
    string(1) "x" 
    ["id"]=> 
    int(22) 
    ["parent"]=> 
    int(20) 
    } 

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

$cat_map = array(
    'Clothing' => 14, 
    'Clothing|Hoodies' => 15, 
    'Clothing|T-shirts' => 19, 
    'My New Cat' => 6, 
    'Posters' => 17, 
    'Music' => 16, 
    'Music|Singles' => 18, 
    'Music|Albums' => 20, 
    'Music|Albums|x' => 22, 
    'Music|Albums|/' => 23, 
    'Music|Albums|+' => 21, 
    'Music|Albums|/|Castle On The Hill' => 24, 
    'Music|Albums|/|Shape Of You' => 25, 
); 

Я застрял, как это сделать; Я бы предположил, что мне нужна рекурсия; но то, что заставило меня застрять, - это порядок массива, с которого я вернусь из woo-коммерции, не в какой-либо форме иерархии. (Приказ, когда я добавил с последним первым)

ответ

0

Я хотел бы сделать петли 3 уровня для того, чтобы получить

  1. Получить родительские категории
  2. Получить дочерние категории
  3. Получить ребенок-ребенок Категории

В каждом цикле я объединяю "|", а затем добавить значение ключа => для каждого уровня .

Следующий код обеспечивает ожидаемый массив

//////////////////////////////////////////////////// 
//creating new array to store new structure 
$cat_map = [] ; 
//3 level loop to get desired info 
foreach($return_woo_categories as $inf){ 
//1 loop to get parent categories 
    if($inf['parent'] == 0){ 
      $parentcategoryname = $inf['name'];   
      $cat_map[$parentcategoryname] = $inf['id'];   
      //2 loop to get 1 child category 
       foreach($return_woo_categories as $inf2){ 
        if($inf['id'] == $inf2['parent']){ 
        //concat first level and second level name    
        $firstchildname = $inf['name']."|".$inf2['name']; 
         $cat_map[$firstchildname] = $inf2['id'];     

        //3 loop to get 2 child category 
        foreach($return_woo_categories as $inf3){ 

         if($inf2['id'] == $inf3['parent']){ 

         $secondchildname = $inf['name']."|".$inf2['name']."|".$inf3['name']; 
          $cat_map[$secondchildname] = $inf3['id'];  

         } 
        } 
        }    
       }   
     } 
} 
//Result 
var_dump($cat_map); 
array (size=11) 
    'Clothing' => int 14 
    'Clothing|Hoodies' => int 15 
    'Clothing|T-shirts' => int 19 
    'Music' => int 16 
    'Music|Albums' => int 20 
    'Music|Albums|/' => int 23 
    'Music|Albums|+' => int 21 
    'Music|Albums|x' => int 22 
    'Music|Singles' => int 18 
    'My New Cat' => int 6 
    'Posters' => int 17 
1

Самый простой способ будет строить дерево (вложенное) структуру первого, а затем использовать рекурсивную функцию для конкатенации строк:

$tree = array(); 
foreach ($return_woo_categories as $cat) { 
    if (!isset($tree[$cat['id']])) { $tree[$cat['id']] = array(); } 
    $tree[$cat['id']]['name'] = $cat['name']; 
    if (!isset($tree[$cat['parent']])) { $tree[$cat['parent']] = array(); } 
    $tree[$cat['parent']]['children'][$cat['id']] =& $tree[$cat['id']]; 
} 

function buildPaths($tree, $path = '') { 
    $result = array(); 
    foreach ($tree as $id => $cat) { 
     $result[$id] = $path . $cat['name']; 
     if (isset($cat['children'])) { 
      $result += buildPaths($cat['children'], $result[$id] . '|'); 
     } 
    } 
    return $result; 
} 

$cat_map = buildPaths($tree[0]['children']); 

Это $cat_map имеет структуру [id] => 'path', поэтому ее нужно будет перевернуть в соответствии с вашим требуемым результатом. Доступ к путям с использованием идентификатора более удобен, чем наоборот, но если вам действительно нужна эта структура, тогда последняя строка будет:

$cat_map = array_flip(buildPaths($tree[0]['children'])); 

 Смежные вопросы

  • Нет связанных вопросов^_^