Разнесение данных индексированного массива по горизонтали - PullRequest
0 голосов
/ 13 июля 2020

После импорта данных я хотел бы развернуть данные каждого подмассива по горизонтали с пробелом в качестве разделителя. Часть каждой строки может отличаться по сумме.

Мои данные:

#ORGNR   "123" 1
#ACCOUNT    1010    "Kassa"
#ACCOUNT    1050    "Bank"
#IB     -1 1010        1923.15
#IB     1 1050         201.42

Мой скрипт:

$array = file('data.txt');
print_r($array);

Результат:

Array
(
    [0] => #ORGNR   "123" 1

    [1] => #ACCOUNT 1010    "Kassa"

    [2] => #ACCOUNT 1050    "Bank"

    [3] => #IB     -1 1010        1923.15

    [4] => #IB     1 1050         201.42

)

Требуемый результат (отображается только первая строка)

Array
(
    [0] => [0 => #ORGNR, 1 => "123",2 => 1]
    // Line 2
    // Line 3
    // Line 4
    // Line 5

)

Ответы [ 4 ]

1 голос
/ 13 июля 2020
$string = '#ORGNR   "123" 1
#ACCOUNT    1010    "Kassa"
#ACCOUNT    1050    "Bank"
#IB     -1 1010        1923.15
#IB     1 1050         201.42';

$result = explode(PHP_EOL, $string);
foreach ($result as $k => $v) {
    $result[$k] = preg_split('/\s+/', trim($v));
}

echo '<pre>';
print_r($result);  

или

$string = '#ORGNR   "123" 1
#ACCOUNT    1010    "Kassa"
#ACCOUNT    1050    "Bank"
#IB     -1 1010        1923.15
#IB     1 1050         201.42';
echo($string);
$result = explode(PHP_EOL, $string);
foreach ($result as $k => $v) {
    $result[$k] = explode(' ', trim(preg_replace('/\s+/', ' ', $v)));
}

echo '<pre>';
print_r($result);

результат

[
    [0] => 'Array',
    [
        [0] => '#ORGNR',
        [1] => '"123"',
        [2] => '1',
    ]

    [1] => 'Array',
    [
        [0] => '#ACCOUNT',
        [1] => '1010',
        [2] => '"Kassa"',
    ]

    [2] => 'Array',
    [
        [0] => '#ACCOUNT',
        [1] => '1050',
        [2] => '"Bank"',
    ]

    [3] => 'Array',
    [
        [0] => '#IB',
        [1] => '-1',
        [2] => '1010',
        [3] => '1923.15',
    ]

    [4] => 'Array',
    [
        [0] => '#IB',
        [1] => '1',
        [2] => '1050',
        [3] => '201.42',
    ]
]
1 голос
/ 13 июля 2020

Я считаю, что лучший метод - preg_split вместо взрыва, поскольку он позаботится о лишних пробелах.

$str = '#ORGNR   "123" 1
#ACCOUNT    1010    "Kassa"
#ACCOUNT    1050    "Bank"
#IB     -1 1010        1923.15
#IB     1 1050         201.42';

$arr = explode("\n", $str); // you use file but it's the same thing

foreach($arr as &$val){
    $val = preg_split("/\s+/", $val);
}

var_dump($arr);

Вывод выше:

array(5) {
  [0]=>
  array(3) {
    [0]=>
    string(6) "#ORGNR"
    [1]=>
    string(5) ""123""
    [2]=>
    string(1) "1"
  }
  [1]=>
  array(3) {
    [0]=>
    string(8) "#ACCOUNT"
    [1]=>
    string(4) "1010"
    [2]=>
    string(7) ""Kassa""
  }
  [2]=>
  array(3) {
    [0]=>
    string(8) "#ACCOUNT"
    [1]=>
    string(4) "1050"
    [2]=>
    string(6) ""Bank""
  }
  [3]=>
  array(4) {
    [0]=>
    string(3) "#IB"
    [1]=>
    string(2) "-1"
    [2]=>
    string(4) "1010"
    [3]=>
    string(7) "1923.15"
  }
  [4]=>
  &array(4) {
    [0]=>
    string(3) "#IB"
    [1]=>
    string(1) "1"
    [2]=>
    string(4) "1050"
    [3]=>
    string(6) "201.42"
  }
}

https://3v4l.org/9hPVd

0 голосов
/ 13 июля 2020

Улучшение решения @Andreas с использованием array_map для краткости

<?php

$str = '#ORGNR   "123" 1
#ACCOUNT    1010    "Kassa"
#ACCOUNT    1050    "Bank"
#IB     -1 1010        1923.15
#IB     1 1050         201.42';

$arr2 = array_map(function($line){
    return preg_split("/\s+/", $line);
}, explode("\n", $str));

var_dump($arr2);

даст такой же правильный результат: https://3v4l.org/20cLd

0 голосов
/ 13 июля 2020

Если я правильно понял вопрос, это то, что вы хотите сделать.

$dataAsArray = file('data.txt');
$result = [];
foreach ($dataAsArray as $data) {
    $result[] = explode(' ', $data);
}

var_dump($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...