2016-08-30 2 views
-5

вот мой массив данныхPHP рекурсивный цикл с суммой

$datas = array(
     '1'=>array('id'=>1,'parent'=>0,'name'=>'Page 1','x'=>1,'y'=>7, 'sumX'=>1), 
     '2'=>array('id'=>2,'parent'=>1,'name'=>'Page 1.1','x'=>3,'y'=>7, 'sumX'=>4), 
     '3'=>array('id'=>3,'parent'=>2,'name'=>'Page 1.1.1','x'=>1,'y'=>5, 'sumX'=>5), 
     '4'=>array('id'=>4,'parent'=>3,'name'=>'Page 1.1.1.1','x'=>4,'y'=>7, 'sumX'=>11), 
     '5'=>array('id'=>5,'parent'=>3,'name'=>'Page 1.1.1.2','x'=>1,'y'=>7, 'sumX'=>6), 


     '6'=>array('id'=>6,'parent'=>1,'name'=>'Page 1.2','x'=>1,'y'=>7, 'sumX'=>2), 
     '7'=>array('id'=>7,'parent'=>6,'name'=>'Page 1.2.1','x'=>1,'y'=>7, 'sumX'=>3), 

     '8'=>array('id'=>8,'parent'=>0,'name'=>'Page 2','x'=>1,'y'=>7, 'sumX'=>1), 
     '9'=>array('id'=>9,'parent'=>0,'name'=>'Page 3','x'=>1,'y'=>5, 'sumX'=>1), 
     '10'=>array('id'=>10,'parent'=>9,'name'=>'Page 3.1','x'=>1,'y'=>7,'sumX'=>2), 
     '11'=>array('id'=>11,'parent'=>9,'name'=>'Page 3.2','x'=>4,'y'=>7, 'sumX'=>5), 
     '12'=>array('id'=>12,'parent'=>11,'name'=>'Page 3.2.1','x'=>1,'y'=>7, 'sumX'=>6) 
); 

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

текущий код я работаю с здесь()

foreach ($datas as $id => &$data){ 

    $parentId = $data['parent']; 
    while ($parentId && isset($datas[$parentId])){ 
     $parentData = &$datas[$parentId]; 

     $parentData["childrenCount"]++; 
     $parentData["SumXCACULATED"] += $data["x"]; 

    // $parentData["SumXCACULATED"] = $data["x"] + $data[$id-1]["SumXCACULATED"]; 


     $parentId = $parentData['parent']; 
    } 

$data["SumXCACULATED"] += $data["x"]; 
} 

производит значение «обратной»

+0

ОК, в этом заключается проблема. Вы явно указываете, что ваш желаемый результат для 'x' должен быть' 2' для 'Page 1.1', но затем вы указываете, что' x' должно быть '3' для' Page 1.1'. Что он? Я не могу удовлетворить противоречивые требования, теперь я могу? – Sherif

+0

Это действительно не так. Желаемый результат не соответствует вашему описанию требований. Поэтому я понятия не имею, что вы хотите. Вы говорите две разные вещи. Попробуйте упростить свои требования. Сейчас вы находитесь в [XY проблема] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Sherif

+0

Извините, это просто непонятно, о чем вы спрашиваете. Вы говорите, что хотите две разные вещи, и теперь вы говорите, что хотите третью вещь. Ничто не складывается для меня. Я не знаю, как вам помочь. Сумма родителей не '3' в' Page 1.1' в соответствии с вашим вводом. Чем больше вы добавляете, тем меньше ощущается все это. – Sherif

ответ

-3

решена, я действительно пытался сделать это сложно, все, что было необходимо простой цикл Еогеасп:

foreach ($datas as $id => &$data){ 

     $data["SumXCACULATED"] = $data["x"] + $datas[$data['parent']] 
} 
1

Я думаю, вы overthinking это только чуть. Вам не нужно суммировать значения $xx или $yy, как вы здесь. Фактически, вам даже не нужно передавать эти значения в свою функцию вообще.

Значения, которые вы хотите для х и у в основном только продукт ($depth + 1) * $datas[$i]['x'] и ($depth + 1) * $datas[$i]['y'] соответственно.

Таким образом, мы приходим к решению, которое выглядит примерно так ...

$datas = array(
    array('id' => 1, 'parent' => 0, 'name' => 'Page 1','x'=>1,'y'=>7), 
    array('id' => 2, 'parent' => 1, 'name' => 'Page 1.1','x'=>1,'y'=>7), 
    array('id' => 3, 'parent' => 2, 'name' => 'Page 1.1.1','x'=>1,'y'=>7), 
    array('id' => 4, 'parent' => 3, 'name' => 'Page 1.1.1.1','x'=>1,'y'=>7), 
    array('id' => 5, 'parent' => 3, 'name' => 'Page 1.1.1.2','x'=>1,'y'=>7), 
    array('id' => 6, 'parent' => 1, 'name' => 'Page 1.2','x'=>1,'y'=>7), 
    array('id' => 7, 'parent' => 6, 'name' => 'Page 1.2.1','x'=>1,'y'=>7), 
    array('id' => 8, 'parent' => 0, 'name' => 'Page 2','x'=>1,'y'=>7), 
    array('id' => 9, 'parent' => 0, 'name' => 'Page 3','x'=>1,'y'=>7), 
    array('id' => 10, 'parent' => 9, 'name' => 'Page 3.1','x'=>1,'y'=>7), 
    array('id' => 11, 'parent' => 9, 'name' => 'Page 3.2','x'=>1,'y'=>7), 
    array('id' => 12, 'parent' => 11, 'name' => 'Page 3.2.1','x'=>1,'y'=>7), 
    ); 

function generatePageTree($datas, $parent = 0, $depth = 0){ 
    if($depth > 1000) return ''; // Make sure not to have an endless recursion 
    $tree = '<ul>'; 
    for($i=0, $ni=count($datas); $i < $ni; $i++){ 
     if($datas[$i]['parent'] == $parent){ 
      $multiplier = $depth + 1; 
      $x = $datas[$i]['x'] * $multiplier; 
      $y = $datas[$i]['y'] * $multiplier; 
      $tree .= '<li>'; 
      $tree .= $datas[$i]['name'].'~~~~~~~~~~~~~~~~~x='. $x .' y='. $y; 
      $tree .= generatePageTree($datas, $datas[$i]['id'], $depth + 1); 
      $tree .= '</li>'; 
     } 
    } 
    $tree .= '</ul>'; 
    return $tree; 
} 


echo generatePageTree($datas); 

, который дает вам именно то, что вы хотите.

 
Page 1~~~~~~~~~~~~~~~~~x=1 y=7 
    Page 1.1~~~~~~~~~~~~~~~~~x=2 y=14 
     Page 1.1.1~~~~~~~~~~~~~~~~~x=3 y=21 
      Page 1.1.1.1~~~~~~~~~~~~~~~~~x=4 y=28 
      Page 1.1.1.2~~~~~~~~~~~~~~~~~x=4 y=28 
    Page 1.2~~~~~~~~~~~~~~~~~x=2 y=14 
     Page 1.2.1~~~~~~~~~~~~~~~~~x=3 y=21 
Page 2~~~~~~~~~~~~~~~~~x=1 y=7 
Page 3~~~~~~~~~~~~~~~~~x=1 y=7 
    Page 3.1~~~~~~~~~~~~~~~~~x=2 y=14 
    Page 3.2~~~~~~~~~~~~~~~~~x=2 y=14 
     Page 3.2.1~~~~~~~~~~~~~~~~~x=3 y=21 
+0

Не знаете, почему вы считаете, что вам нужно это сделать. Вы получаете __x__ и __y__ из вашего массива '$ datas [$ i] ['x']' и '$ datas [$ i] ['y']' и ваш желаемый результат ___clearly___ выражает, что их следует умножать на их глубина. Таким образом, вы можете изменить свои значения в своем массиве, сколько хотите. Результат, как он был выведен (_ кратным глубине_). Я не уверен, что их добавление всегда позволит удовлетворить это требование. Но не стесняйтесь уточнять свои требования, если вы не смогли сделать это в первый раз. Ваш желаемый результат, как он был описан __you__, был встречен здесь. – Sherif

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