Цикл возврата по каждому циклу

У меня есть файл .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, там всегда 3 строки на 1 транспортное средство,

  • первая строка с кодом
  • вторая строка с именем
  • третья строка с типом vehicle_type

Мой скрипт может получить правильные значения, несмотря на тот факт, что мой цикл как-то не работает, потому что в переменных есть неверные значения. Так, например, если я запускаю этот цикл на весь файл
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 пустых значений во всем документе, так что на самом деле не так много

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"}
}
*/
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector