草庐IT

php - 在PHP中创建一个不确定深度的多维数组

coder 2024-04-19 原文

晚上好 - 我正在尝试根据存储在数据库中的帐户代码的分解文本字符串创建一个多维数组。帐户代码将具有不同的长度/深度。例如,下面数组中的 $test 与我从数据库中提取的结果类似:

$test = array( 
    '110|5100|120'    => 'Teacher Salaries',
    '110|5100|130'    => 'Other Professoinal Services',
    '110|5100|510|1'  => 'Primary Supplies',
    '110|5100|510|2'  => 'Intermediate Supplies', 
    '110|7300|110'    => 'Administrator Salaries', 
    '110|7300|510'    => 'Administrative Supplies', 
    '763|5100'        => 'Academic Grants'
); 
foreach($test AS $k => $v) { 
    $lvl = explode("|", $k);
    // Not sure what to do next... 
}

我想做的是创建一个函数,它将返回如下数组:

[110] => Array
    (
        [5100] => Array
            (
                [120] => Teacher Salaries
                [130] => Other Professional Services
                [510] => Array
                    (
                        [1] => Primary Supplies
                        [2] => Intermediate Supplies
                    )
            )
        [7300] => Array
            (
                [110] => Administrator Salaries
                [510] => Supplies
            )
    )
[763] => Array
    (
        [5100] => Academic Grants
    )

我能够想出一个函数,可以采用单个代码并将其正确分解为一个数组,但是当我尝试将它们合并在一起时,它们会丢失它们的 key 。这是我到目前为止所拥有的:

function expandedArray($codes, $value) { 
    $decoded = explode("|",$codes);
    RETURN expandedArraySub($decoded, $value); 
}
function expandedArraySub($decoded = array(), $value = Null) { 
    $k = array_pop($decoded); 
    $out[$k] = $value;
    if(is_array($decoded) && count($decoded) > 0) { $out = expandedArraySub($decoded, $out); }
    RETURN $out;
}

但是当我运行以下命令时,我没有像上面描述的那样得到我想要的,而是得到一个丢失“110”键的数组:

$r1 = expandedArray('110|5100|510|1', "Primary Supplies"); 
  // $r1 is now [ 110 => [5100 => [510 => [ 1 ] ] ] ]
$r2 = expandedArray('110|5100|510|2', 'Intermediate Supplies'); 
  // $r2 is now [ 110 => [5100 => [510 => [ 2 ] ] ] ]
$r = array_merge($r1, $r2); 

我得到的结果删除了第一个键,并没有像我希望的那样合并结果。这是我得到的:

[0] => Array
    (
        [5100] => Array
            (
                [510] => Array
                    (
                        [1] => Primary Supplies
                    )
            )
    )
[1] => Array
    (
        [5100] => Array
            (
                [510] => Array
                    (
                        [2] => Intermediate Supplies
                    )
            )
    )

非常感谢任何帮助!谢谢!

最佳答案

试试这段代码:

function getVal($data,$chain){
    $level = $data;
    for($i=0;$i<count($chain);$i++){
        if(isset($level[$chain[$i]]))
            $level = $level[$chain[$i]];
        else
            return null; // key does not exist, return null
    }
    return $level;
}

function setVal(&$data,$chain,$value){
    $level = &$data;
    for($i=0;$i<count($chain);$i++){
        $level = &$level[$chain[$i]]; // set reference (&) in order to change the value of the object
    }
    $level = $value;
}

要像这样使用它:

$output = array();
$test = array( 
    '110|5100|120'    => 'Teacher Salaries',
    '110|5100|130'    => 'Other Professoinal Services',
    '110|5100|510|1'  => 'Primary Supplies',
    '110|5100|510|2'  => 'Intermediate Supplies', 
    '110|7300|110'    => 'Administrator Salaries', 
    '110|7300|510'    => 'Administrative Supplies', 
    '763|5100'        => 'Academic Grants'
); 
foreach($test AS $k => $v) { 
    $lvl = explode("|", $k);
    setVal($output,$lvl,$v); 
}

$output 应具有所需的格式。

my previous post 中阅读有关此代码的更多信息

关于php - 在PHP中创建一个不确定深度的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46046631/

有关php - 在PHP中创建一个不确定深度的多维数组的更多相关文章

  1. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  2. ruby - 如何在 Ruby 中创建无类 DSL? - 2

    我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

  3. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  4. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  7. ruby - 如何在 Ruby 中获取多维哈希中的键? - 2

    因此,对于普通哈希,您可以使用它来获取key:hash.keys如何获取如下所示的多维哈希的第二维键:{""=>{"first_name"=>"test","last_name"=>"test_l","username"=>"test_user","title"=>"SalesManager","office"=>"test","email"=>"test@test.com"}}每个项目都是唯一的。所以我想从上面得到的键是:first_name,last_name,username,title,officeandemail 最佳答案

  8. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

  9. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  10. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

随机推荐