【问题标题】:Extracting things I want out of an array?从数组中提取我想要的东西?
【发布时间】:2013-02-15 16:31:48
【问题描述】:

我有一个需要解析为数组的 yaml 文件,然后我完成了。现在这个数组很大。我只想要几个值...

X1,Y1,X2,Y2,所有者,这就是我想要的。如果我能让它们很好地吐出成阵列,那对我来说就意味着世界。 (所有者必须是与那些X1,y1,x2,y2值相关的所有者......

(它们都是相互关联的)数组中有很多x1,y1,但它们都在标题下......等等我不知道如何得到它们......

这是数组吐出的内容...(由于文件大小限制而缩短) http://pastebin.com/PyH18mZv

任何帮助将不胜感激。

【问题讨论】:

    标签: php yaml


    【解决方案1】:

    要解析 YAML,您可以使用各种可用的 PHP 解析器。我使用 Online YAML Parser 解析了您的 YAML,并以 JSON 格式输出字符串。最后,可以通过解码 JSON 来访问所需的数组值。

    * 请注意,我将字符串剪短只是为了举例 *

    $arr='{
    "Residences": {
    "WorkArea": {"BlackList": {"Type": "BLACKLIST", "ItemList": []}, 
      "EnterMessage": "Welcome %player to %residence, owned by %owner.", 
      "Areas": {
        "main": {
          "Y1": 217, 
          "X1": -6301, 
          "X2": -6306, 
          "Y2": 205, 
          "Z1": 3001, 
          "Z2": 2981
        }
      }, 
      "Permissions": {"Owner": "cal9897","World": "VivaWorld"}
    }, 
    "caylyn55": {
      "BlackList": {
        "Type": "BLACKLIST", 
        "ItemList": []
      }, 
      "EnterMessage": "Welcome %player to %residence, owned by %owner.", 
      "StoredMoney": 0, 
      "IgnoreList": {
        "Type": "IGNORELIST", 
        "ItemList": []
      }, 
      "LeaveMessage": "Now leaving %residence.", 
      "Subzones": {}, 
      "Areas": {
        "main": {
          "Y1": 67, 
          "X1": 1220, 
          "X2": 1210, 
          "Y2": 64, 
          "Z1": 369, 
          "Z2": 360
        }
      }, 
      "Permissions": {
        "Owner": "caylyn55",
        "PlayerFlags": {}, 
        "GroupFlags": {}, 
        "World": "VivaWorld"
      }
    }
    }, 
     "Version": 1, 
     "Seed": 1337068141
      }';
    

    解码 JSON

    $a= json_decode($arr,true);
    

    第一个区域值通过

    $a['Residences']['WorkArea']['Areas']['main']['Y1'];
    

    和第二区域值

    $a['Residences']['caylyn55']['Areas']['main']['Y1'];  
    

    如果 ['WorkArea'] AND ['caylyn55'] 是动态的,您可以使用此代码

    $b=array_values($a);
    foreach($b as $values)
    {
    if(is_array($values)) {
    
        foreach(array_keys($values) as $c){
    
         echo  $a['Residences'][$c]['Areas']['main']['Y1'];
    
            }
    
        }
    
    }
    

    【讨论】:

    • 问题是我有大约 500-800 个东西需要解析... $a['Residences']['THIS PART']['Areas']['main'][ 'Y1'];说这部分的部分,有没有办法自动化?有某种外观,因为我必须为大约 500 个这样做。
    • 如果[这部分]是动态的?那么每次你都必须知道它。如果您已经知道,则可以将所有 [THIS PART] 保存在数组/数据库中以遍历解析的 YAML。
    • 它是 100% 动态的,它来自用户输入,所以它可以是任何东西 :(
    • 请看编辑,这只是一个可以用来捕获数组键和值的想法;
    • 天哪!惊人的!非常感谢,太棒了!
    【解决方案2】:

    您只需要添加对您尝试输出的数据的完整引用。

    示例:echo $data['Residences']['WorkArea']['Permissions']['Owner'];

    【讨论】:

    • 我们可以取消完整的 YAML 解析吗?
    • 我有 yaml 文件。我需要某种方式让 php 阅读它,以便我可以对此提出建议?这是它的外观...... pastebin.com/t702t0x9 让它像文本文件一样对待它可能是一个好主意吗?查找 x1,y1 并在其后抓取字符串 w/e,然后是所有者,然后是下一个 x1,y1 等
    【解决方案3】:

    类似的东西

    $extracted = array_map(function ($residence) {
        $r = $residence['Areas']['main'];
        $r['owner'] = $residence['Permissions']['Owner'];
        return $r;
    }, $data['Residences']);
    

    【讨论】:

    • $data 被解析 yaml 数组
    • 我得到的错误是,警告:array_map(): Argument #2 should be an array in C:\xampp\htdocs\yaml-load.php on line 20
    • 参数 #2 应该是 pastebin pastebin.com/PyH18mZv 中描述的数组,检查它的键并调整给定的代码
    • 很抱歉我没有完全理解。我从来没有对 array_maps 做过任何事情。
    • 在处理数组时非常有帮助。查看其文档和示例:php.net/manual/en/function.array-map.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2012-05-16
    相关资源
    最近更新 更多