【问题标题】:Foreach cycle return randly changed valuesForeach 循环返回随机变化的值
【发布时间】:2015-07-23 11:47:57
【问题描述】:

我有一些无法更改的 .ini 文件。它看起来像:

01code6=77
01name6=G 650 Xcountry/Xmoto/Xchallenge (K15) [V] [77]
01type6=Bike
01code7=E3
01name7=i3 od 07/13 (I01) [V] [S] [3D] [IRE] [E3]
01type7=Car
01code8=E8
01name8=i8 kupé od 03/14 (I12) [V] [3D] [E8]
01type8=Car
01code9=80
01name9=K 100 - K 1200 RS / K1 od 04/84 [V] [80]
01type9=Bike

解析它的代码如下:

public function pasrseString($path)
{
    $ini = parse_ini_file($path, false, INI_SCANNER_RAW);
    foreach(array_chunk($ini, 3, true) as $data) 
    {                                                   
            // $data is an array of just the 3 that are related
            $mcode = substr(array_keys($data)[0], 0, 2);
            $nameLine = array_values($data)[1];
            $typeLine = array_values($data)[2];
            $vehicle = array_values($data)[0];
            echo $vehicle;
            echo "<br>";
            echo $typeLine;
            echo "<br>";
            echo $nameLine;
            echo "<br>";
            echo $mcode;                                
    }
}

正如您在 .ini 文件中看到的,1 辆车总是 3 行,

  • 第一行代码
  • 第二行有名字
  • 第三行带有车辆类型

我的脚本可以得到正确的值,尽管我的循环以某种方式失败,因为变量中有错误的值。例如,如果我在整个文件上运行这个循环 echo $vehicle 一些车辆返回车辆数据,另一种车辆返回车辆类型,另一种返回mcode,尽管文件中总是有这样的顺序。

我真的很困惑,我在这个循环中做错了什么,有人可以帮助找到解决方案吗?

附言如果我在foreach(array_chunk($ini, 3, true) as $data) 中使用更大或更小的值,值的顺序会发生变化

编辑: 我发现代码中有一些空白数据,例如

01code0=
01name0=

所以带有空白值的示例代码可能如下所示:

00code46=65
00name46=TT kupé od 07/14 (FV) [V] [S] [3D] [65]
00type46=Car
00code47=45
00name47=TT od 08/06 (8J) [V] [S] [3D] [IRE] [45]
00type47=Car
01code0=
01name0=
01code1=M2
01name1=C 600 Sport/C 650 GT od 01/12 (K18/0131) (K19/0133) [V] [M2]
01type1=Bike
01code2=70
01name2=F 650 GS / F 800 GS od mod. ´08 [V] [70]
01type2=Bike
01code3=84

整个文档中只有 5 个空白值,所以真的不多

【问题讨论】:

  • 为什么要更改array_chunk中的值?
  • 我没有,他们没有我的决定就改变了。我需要始终在一个变量中具有一种值。但我担心我做了一些疯狂的冒险,我的周期无法正常工作
  • i as k 关于这个 * 我使用更大或更小的值*

标签: php foreach cycle


【解决方案1】:

稍后会有点 php 魔法:

$vehicles = array_map(function($vs){ 
    return array_combine(array('code','name','type'),$vs);
}, array_chunk(parse_ini_string($x,false,INI_SCANNER_RAW),3));

解析ini,chunkify,映射块将位置转换为名称

完整代码:

$x = <<<EOD
01code6=77
01name6=G 650 Xcountry/Xmoto/Xchallenge (K15) [V] [77]
01type6=Bike
01code7=E3
01name7=i3 od 07/13 (I01) [V] [S] [3D] [IRE] [E3]
01type7=Car
01code8=E8
01name8=i8 kupé od 03/14 (I12) [V] [3D] [E8]
01type8=Car
01code9=80
01name9=K 100 - K 1200 RS / K1 od 04/84 [V] [80]
01type9=Bike
EOD;

$vehicles = array_map(function($vs){ 
    return array_combine(array('code','name','type'),$vs);
}, array_chunk(parse_ini_string($x,false,INI_SCANNER_RAW),3));

var_dump($vehicles); // over which you can iterate to produce the output
/*
array(4) {
  [0]=>
  array(3) {
    ["code"]=>
    string(2) "77"
    ["name"]=>
    string(46) "G 650 Xcountry/Xmoto/Xchallenge (K15) [V] [77]"
    ["type"]=>
    string(4) "Bike"
  }
  [1]=>
  array(3) {
    ["code"]=>
    string(2) "E3"
    ["name"]=>
    string(41) "i3 od 07/13 (I01) [V] [S] [3D] [IRE] [E3]"
    ["type"]=>
    string(3) "Car"
  }
  [2]=>
  array(3) {
    ["code"]=>
    string(2) "E8"
    ["name"]=>
    string(37) "i8 kupé od 03/14 (I12) [V] [3D] [E8]"
    ["type"]=>
    string(3) "Car"
  }
  [3]=>
  array(3) {
    ["code"]=>
    string(2) "80"
    ["name"]=>
    string(40) "K 100 - K 1200 RS / K1 od 04/84 [V] [80]"
    ["type"]=>
    string(4) "Bike"
  }
}
*/

【讨论】:

  • 嗨@birdspider,谢谢你的回答。它实际上看起来很酷。所以+1!我可以知道如何单独到达每个“汽车”吗?我做了: foreach($vehicles as $vehicle) { echo $vehicle['code'];回声“
    ”;它有时会回显代码,有时会键入,有时会命名
  • @Andurit:取决于你对individualy的意思,现在你可以使用$vehicles[3]来获得第4辆车等等......
  • @Andurit: 所以sometimes type and sometimes name 的意思是:输入文件字段未排序,即使您的样本建议如此? - 你可以这么说
  • 我正在重新归档,它们总是以相同的方式排序,只是注意到有时会有空白的“数据”,例如:01code0= 01name0= 这与它有什么联系吗?
  • 抱歉,这里更具体地说是输入端口和输出的一部分,它从“名称”变为“类型”pastebin.com/dZEx4siA
猜你喜欢
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多