How do you put a few masses into a multi-dimensional association?



  • Several types of species must be converted:

    $a1 = array(279171, 438170);
    $a2 = array(279171, 438156, 438157);
    $a3 = array(279171, 438178);
    $a4 = array(279172, 436113, 436115);
    $a5 = array(279172, 436113, 438108);
    

    $input = array($a1, $a2, $a3, $a4, $a5);

    In structure:

    $result = array(
    '279171' => array(
    '438170',
    '438156' = array(
    '438157'
    ),
    '438178'
    ),
    '279172' => array(
    '436113' => array(
    436115,
    438108
    )
    )
    );

    How to create a function that takes $input and returns $result?



  • Use references.
    Here. JS It was easy to write, but here it is. PHP It's a little confusing, :

    JS

    let a1 = [279171, 438170],
      a2 = [279171, 438156, 438157],
      a3 = [279171, 438178],
      a4 = [279172, 436113, 436115],
      a5 = [279172, 436113, 438108],
      input = [a1, a2, a3, a4, a5];
    

    function transf(inp) {
    let res = {}; // Будущее древо результата

    function push(item, ref) {
    // Создаём ссылку на древо, которую будем подменять
    let pointer = ref;

    // Проходим по внутренностям очередного массива
    item.forEach(i => {
      if (!(i in pointer)) // Если нет ключа, создаём его
        pointer[i] = {};
    
      pointer = pointer[i]; // Ставим ссылку на наш итерируемый указатель
    });
    

    }

    inp.forEach(e => {
    push(e, res); // Передаём очередной массив на добавление
    });

    return res;
    }

    console.info(transf(input));

    PHP

    $a1 = array(279171, 438170);
    $a2 = array(279171, 438156, 438157);
    $a3 = array(279171, 438178);
    $a4 = array(279172, 436113, 436115);
    $a5 = array(279172, 436113, 438108);

    $input = array($a1, $a2, $a3, $a4, $a5);

    function transf($inp){
    $res = [];

    function push($item, &$ref){
        $pointer = &$ref;
    
        foreach($item as $i){
            if(!isset($pointer[$i]))
                $pointer[$i] = [];
    
            $pointer = &$pointer[$i];
        }
    
        return $ref;
    }
    
    foreach($inp as $e){
        push($e, $res);
    }
    
    return $res;
    

    }

    var_dump(transf($input));

    https://repl.it/CcEI/0 ♪


Log in to reply
 


Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2