PHP оценивает многомерный массив от внутреннего массива до внешнего массива

1

Как решить следующую проблему с помощью PHP RecursiveIteratorIterator?

$arr = array(
    "sum"=>array(2,4,6, "multiply" => array(1,3,5) ),
    "multiply"=>array(3,3,3, "sum" => array(2,4,6) ),
);

Я ожидаю следующие ответы

(2 + 4 + 6 + ( 1 * 3 * 5) ) = 27; 
(3 * 3 * 3 * (2 + 4 + 6)) = 324;

Частичный код до сих пор..

   $calc = new ArrayObject($arr);
   $MRI = new RecursiveIteratorIterator(new      MyRecursiveIterator($calc), 1);
   foreach ($MRI as $key=>$value) {
   echo " Current Depth: ". $MRI->getDepth() . "\n"; 
   echo $key . " : " . $value . "\n";
   $currentDepth = $MRI->getDepth();
   for ($subDepth = $currentDepth; $subDepth >= 0; $subDepth--)
   { echo "sub Depth: ". $subDepth . "\n"; 
   $subIterator = $MRI->getSubIterator($subDepth);
   // var_dump($subIterator); } }
  • 1
    Пожалуйста, покажите нам ваш прогресс.
  • 0
    Потратил много времени, не в силах разобраться. Я все еще пытаюсь
Показать ещё 4 комментария
Теги:
arrays
multidimensional-array

2 ответа

1
Лучший ответ

Вы можете сделать это так, сделайте расчет из самого внутреннего массива. Проверьте demo.

<?php
function f(&$array)
{
    foreach($array as $k => &$v)
    {
        if(is_array($v))
        {
            if(count($v) == count($v, 1))
            {
                unset($array[$k]);
                if($k == 'sum')
                {
                    $v =  array_sum($v);
                    $array[] = $v;

                }elseif($k == 'multiply'){
                    $v = array_product($v);
                    $array[] = $v;
                }else{

                    foreach($v as $vv)
                        $array[] = $vv;
                }
            }else
                f($v);
        }
    }
}

while(count($array) != count($array, 1))
{
    f($array);
}

print_r($array);

Примечание:

перемещать массив из внешнего в внутренний
перемещать массив из внутреннего в внешний

  • 0
    Большое спасибо. Я использую php версии 5.4, изменится ли приведенный выше код для старой версии?
  • 0
    Кроме того, это будет работать для более глубоких уровней массивов? Например: $ arr = array ("sum" => array (2,4,6, "multiply" => array (1,3, "sum" => array (1,5,6, "multiply" => массив (2,2,2, "сумма" => массив (4,4,4))))), "умножить" => массив (3,3,3, "сумма" => массив (2,4, 6)));
Показать ещё 6 комментариев
0

Простое и простое решение: -

$arr = array("sum"=>array(2,4,6, "multiply" => array(1,3,5) ),"multiply"=>array(3,3,3, "sum" => array(2,4,6)));
    foreach($arr as $key => $newarr){
        if($key =="sum"){
            $sum = array_sum($newarr);
            $product = array_product($newarr['multiply']);
            $finalarray[$key] = $sum+$product;
        }elseif($key =="multiply") {
            $product = array_product($newarr);
            $sum = array_sum($newarr['sum']);
            $finalarray[$key] = $sum*$product;
        }
    }
    echo "<pre>"; print_r($finalarray);

Надеюсь, что это поможет!

  • 0
    Спасибо, кунал. Оно работает. Просто любопытно, будет ли работать более глубокие уровни массивов? например, $ arr = array ("sum" => array (2,4,6, "multiply" => array (1,3, "sum" => array (1,5))), "multiply" = > массив (3,3,3, "сумма" => массив (2,4,6)));
  • 0
    в соответствии с вашей структурой массива это будет работать определенно :) @subra
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню