【问题标题】:php evaluating multidimensional array from inner array to outer ararayphp评估从内部数组到外部数组的多维数组
【发布时间】:2018-05-19 21:01:51
【问题描述】:

如何使用 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); } }

【问题讨论】:

  • 请向我们展示您目前的进展。
  • 花了很多时间,无法弄清楚。我还在努力
  • 我很确定 Scuzzy 希望您展示您尝试过的代码。不只是说你已经尝试过了。
  • 到目前为止的部分代码..
  • 部分代码.. $calc = new ArrayObject($arr); $MRI = new RecursiveIteratorIterator(new MyRecursiveIterator($calc), 1); foreach ($MRI as $key=>$value) { echo " Current Depth: ". $MRI->getDepth() 。 "\n"; ;回声 $key 。 “:”。 $价值。 "\n"; $currentDepth = $MRI->getDepth(); for ($subDepth = $currentDepth; $subDepth >= 0; $subDepth--) { echo "sub Depth:". $subDepth 。 "\n"; ; $subIterator = $MRI->getSubIterator($subDepth); // var_dump($subIterator); } }

标签: php arrays multidimensional-array recursiveiterator


【解决方案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);

注意:

traverse array from outer to inner
traverse array from inner to outer

【讨论】:

  • 非常感谢。我使用的是 php 5.4 版本,上面的代码是否会更改为旧版本?
  • 另外,这对更深层次的数组有用吗?例如: $arr = array("sum"=>array(2,4,6, "multiply" => array(1,3, "sum" => array(1,5,6,"multiply"=>数组(2,2,2, "sum" => array(4,4,4))))),"multiply"=>array(3,3,3, "sum" => array(2,4, 6)));
  • Kris,评估在最深层次停止。我尝试了以下数组,它不起作用。 $arr = array( "sum"=>array(2,4,6, "multiply" => array(1,3,5, "sum" =>array(1,2)) ), "multiply"=>数组(3,3,3,“总和”=> 数组(2,4,6)),);你有什么建议
  • @subra 立即查看。
  • 效果很好。精彩的。谢谢。
【解决方案2】:

简单易行的解决方案:-

$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);

希望对你有帮助!

【讨论】:

  • 谢谢库纳尔。有用。只是好奇,它会在更深层次的数组中工作吗?例如,$arr = array("sum"=>array(2,4,6, "multiply" => array(1,3, "sum" => array(1,5)) ),"multiply"= >array(3,3,3, "sum" => array(2,4,6)));
  • 根据你的数组结构,它肯定会工作:) @subra
  • $arr = array("sum"=>array(2,4,6, "multiply" => array(1,3, "sum" => array(1,5,6, "multiply"=>array(2,2,2, "sum" => array(4,4,4))))),"multiply"=>array(3,3,3, "sum" => array (2,4,6)));我试过这个数组。这是行不通的。可能是我需要使用递归循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多