【问题标题】:Iterating a Multidimensional Array迭代多维数组
【发布时间】:2014-05-17 22:35:12
【问题描述】:

我在正确迭代多维数组时遇到问题我正在尝试检索每个井的值..值。

我的问题是我似乎在一个数组中有一个数组,其中每个键/对值都有一个数组,我不确定如何遍历这些数组并将每个数组的值添加到数据库中。

例如,如果我的页面上有一个表单,则数组返回低于,再往下是两个表单返回的内容等

Array
(
    [0] => Array
        (
        [0] => Array
             (
                [name] => sl_propid
                [value] => 21
             )

        [1] => Array
            (
                [name] => sl_date
                [value] => 04/01/2014
            )

        [2] => Array
            (
                [name] => sl_ref
                [value] => Form1
            )

        [3] => Array
            (
                [name] => sl_nom_id
                [value] => 12
            )

        [4] => Array
            (
                [name] => sl_desc
                [value] => Form1
            )

        [5] => Array
            (
                [name] => sl_vat
                [value] => 60
            )

        [6] => Array
            (
                [name] => sl_net
                [value] => 999
            )

    )

)


我的问题是如何遍历返回的数组,无论它的大小,并拉回每个值

我尝试过嵌套 foreach 循环,这确实给了我结果,但只针对一个键/值对,这让我相信我做错了循环,我可以检索值,如果我是静态访问的,正常情况下当然没用。

foreach ($result as $array) {
            print_r($array);

    }

上面的 foreach 返回上面的数组,添加另一个 foreach 删除了“容器”数组,但添加了另一个 foreach 循环,只返回一个键/值对,这种排序是有意义的,因为第一个索引也是一个数组,希望我没有像我自己一样混淆其他所有人:。

感谢您的阅读 任何帮助表示赞赏。


编辑使用下面的数组遍历递归我得到输出

    $result = $this->input->post();


    function test_print($item, $key)
    {
    echo "$key holds $item\n";


    //$this->SalesLedgerModel->addInvoiceToLedger($key, $key, $key, $key, $key, $key, $key);
    }

        array_walk_recursive($result, 'test_print');


    }

这几乎是我想要的,但是我如何获取每个单独的值并将其添加到我的 ModelFunction(以实际将数据输入到 DB)

该函数有 7 个参数,但我不确定如何确保正确的信息传递给正确的参数

$this->SalesLedgerModel->addInvoiceToLedger($propid, $date, $ref, $nomid, $desc, $vat, $net); 

我的控制器功能

function addInvoiceToLedger(){
         $this->load->model('SalesLedgerModel');
         // $propid = $this->input->post('propid');

     // $date = $this->input->post('date');
     // $ref = $this->input->post('ref');
     // $nomid = $this->input->post('id');
     // $desc = $this->input->post('desc');
     // $vat = $this->input->post('vat');
     // $net = $this->input->post('sl_net');



    $results = $this->input->post();
    //var_dump($results);   

        $size1 = sizeof($results)-1;

        for($i=0; $i<=$size1; $i++)
        {
            $size2 = sizeof($results[$i])-1;

            for($j=0; $j<=$size2; $j++)
            {
                $name = $results[$i][$j]['name'];
                $value = $results[$i][$j]['value'];

               echo $value . "\n" ; 
               $this->SalesLedgerModel->addInvoiceToLedger($value, $value, $value, $value, $value, $value, $value);

            }
        }

我的模型函数

function addInvoiceToLedger($propid, $date, $ref, $nomid, $desc, $vat, $net){

        $data = array('sl_prop_id' => $propid, 'sl_date' => $date,
            'sl_ref' => $ref, 'sl_nominal_sub' => $nomid, 'sl_invoice_desc' => $desc, 'sl_vat' => $vat, 'sl_amount' => $net);

        $this->db->insert('salesledger', $data);
    }

【问题讨论】:

    标签: php arrays codeigniter multidimensional-array foreach


    【解决方案1】:

    您可以编写一些递归代码来逐步遍历数组并在元素变成数组时再次调用自身,或者编写一个非常简单的函数并通过array walk recursive 调用它,然后您可以随心所欲地做任何事情价值:

    <?php
    $sweet = array('a' => 'apple', 'b' => 'banana');
    $fruits = array('sweet' => $sweet, 'sour' => 'lemon');
    
    function test_print($item, $key)
    {
        echo "$key holds $item\n";
    }
    
    array_walk_recursive($fruits, 'test_print');
    ?>
    

    输出:

    a holds apple
    b holds banana
    sour holds lemon
    

    【讨论】:

    • 我不确定如何在我的模型函数$this-&gt;SalesLedgerModel-&gt;addInvoiceToLedger($propid, $date, $ref, $nomid, $desc, $vat, $net); 中使用这些值,因为我不能将它设置为$this-&gt;SalesLedgerModel-&gt;addInvoiceToLedger($item, $item, $item, $item, $item, $item, $item);,因为变量会不断变化,还是我又理解错了?
    • 或者我会使用密钥吗?
    • 我不知道你的意思是什么对不起。您应该根据需要将参数传递给函数吗?
    • 对不起,我似乎因为无法解释而惹恼了这里的人,因为您可以看到我的 AddInVoiceToLedger 方法每次插入一个新的数据库条目时需要 7 个参数。如何以正确的顺序从 test_print 函数中获取值到我的 AddInVoiceToLedger 函数中?例如,我不能说 $propid = $key 因为每次密钥更改时循环都会多次覆盖 propid,我有什么意义吗? D:这太令人沮丧了,我什至无法正确解释我正在尝试做什么,更不用说我自己了哈哈。
    【解决方案2】:

    试试这个。它会快得多。因为 3 foreach loops 比 2 for loops 贵很多(for loopsforeach loops 快​​)-

    $size1 = sizeof($results)-1;
    
    if($size1 > 0)
    {
        for($i=0; $i<=$size1; $i++)
        {
            $size2 = sizeof($results[$i])-1;
    
            if($size2 > 0)
            {
                for($j=0; $j<=$size2; $j++)
                {
                    $name = $results[$i][$j]['name'];
                    $value = $results[$i][$j]['value'];
    
                    $insert = $this->your_model->insert($name, $value);
                }
            }
        }   
    }
    

    【讨论】:

    • 它会为未定义的偏移量 [0] 引发错误 :( Severity: Notice Message: Undefined offset: 0 Filename: controllers/FinancialInput.php 在第 49 行,即 $size2 = sizeof($results[$i]);
    • 我刚刚测试过。它工作正常。当数组为空时可能会出现这种情况。
    • 不,你是对的,它确实有效,也就是说,我可以打印出每个值,但我仍然不明白如何将它传递给我的模型函数:((这是有问题的)如果我尝试传递它 $value 那么它会简单地将第一个值放在每一列中,与我在 D 下面的答案相同的问题:
    • “查询”位对我没有用,因为这是在我的控制器而不是我的模型中,我只是在尝试将正确的变量传递给正确的参数
    • 检查编辑过的一个。我想这就是你在说的。
    【解决方案3】:
    foreach ($result as $array) {
      foreach($array as $arr){
         foreach($arr as $a){
           echo $a[value];
         }
      }
    
    }
    

    【讨论】:

    • 这不适用于嵌套在第二个数组中的数组。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2021-11-02
    • 2011-11-20
    • 2016-01-28
    • 2020-02-17
    • 2013-01-23
    相关资源
    最近更新 更多