Извлечение ключевых элементов из Json в PHP - PullRequest
4 голосов
/ 24 апреля 2019

Мне нужно работать с файлом Json внутри PHP таким образом, чтобы я мог выполнять итерацию внутри определенного ключа его основных элементов.

У меня есть этот пример данных Json:

[{"A": [
    {
        "name": "object 1",
        "code": "x001",
        "date": "2018-01-01T23:00:00-0600"
    },
    {
        "name": "object 2",
        "code": "x002",
        "date": "2018-01-01T23:00:00-0600"
    },
    {
        "name": "object 3",
        "code": "x003",
        "date": "2018-01-01T23:00:00-0600"
    }
]},{"B": [
    {
        "name": "object 1",
        "code": "y001"
        "date": "2018-01-01T23:00:00-0600"
    },
    {
        "name": "object 2",
        "code": "y002",
        "date": "2018-01-01T23:00:00-0600"
    }
]}]

Насколько я знаю, я могу обработать файл Json (без вложенных элементов в основных ключах A и B) следующим образом:

<?php
$url = './data.json';
$data = file_get_contents($url);
echo "<!--- File contents -->\n";
var_dump($data);
$contents = json_decode($data, true);
echo "<!--- Associative Array -->\n";
var_dump($contents);


echo "<!--- BEGIN -->";
foreach ($contents as $element) {
        echo "Name: " . $element['name'] . "\n";
        echo "Code: " . $element['code'] . "\n";
        echo "Date: " . $element['date'] . "\n";
        echo "- - - - - -\n";
}
echo "<!--- END -->";
?>

Я пытаюсь вызвать циклнапример, внутри данного ключа цикл для всех элементов, соответствующий B :

    {
        "name": "object 1",
        "code": "y001"
        "date": "2018-01-01T23:00:00-0600"
    },
    {
        "name": "object 2",
        "code": "y002",
        "date": "2018-01-01T23:00:00-0600"
    }

Это может быть извлечение этих элементов во второй ассоциативный массив или другой предложенный подход ...

И ожидаемый результат должен быть:

Name: object 1
Code: y001
Date: 2018-01-01T23:00:00-0600
- - - - - -
Name: object 2
Code: y002
Date: 2018-01-01T23:00:00-0600
- - - - - -

Игнорирование A элементов

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

Пожалуйста, попробуйте этот файл. Вы можете попробовать это самостоятельно, скопировав этот код.

<code><?php

$data = '[{"A":[{"name": "object 1","code": "x001","date": "2018-01-01T23:00:00-0600"},{"name": "object 2","code": "x002","date": "2018-01-01T23:00:00-0600"},{"name": "object 3","code": "x003","date": "2018-01-01T23:00:00-0600"}]},{"B": [{"name": "object 1","code": "y001","date": "2018-01-01T23:00:00-0600"},{"name": "object 2","code": "y002","date": "2018-01-01T23:00:00-0600"}]}]';

// $url = './data.json';
// $data = file_get_contents($url);
echo "<!--- File contents -->\n";
$contents = json_decode($data, true);
echo "<!--- Associative Array -->\n";
echo "<pre>";
// var_dump($contents);
echo "
"; echo "<! --- BEGIN ->"; echo "
";
foreach ($contents as $element) {

    if(!isset($element['B'])) continue;
    foreach($element as $items){
        foreach($items as $item){
        echo "Name: " . $item['name'] . "\n";
        echo "Code: " . $item['code'] . "\n";
        echo "Date: " . $item['date'] . "\n";
        echo "- - - - - -\n";
        }
    }
    echo "- - - - - -\n";
}
echo "
"; echo "<! --- END ->";

OUTPUT

Name: object 1
Code: y001
Date: 2018-01-01T23:00:00-0600
- - - - - -
Name: object 2
Code: y002
Date: 2018-01-01T23:00:00-0600
- - - - - -
- - - - - -
1 голос
/ 24 апреля 2019

Вы можете сделать это таким образом с foreach() петлями

$array = json_decode($json,1);
//$array[1] for accessing contents of B
echo "<!--- BEGIN -->\n";
foreach($array[1] as $key=>$contents){
   foreach ($contents as $element) {
        echo "Name: " . $element['name'] . "\n";
        echo "Code: " . $element['code'] . "\n";
        echo "Date: " . $element['date'] . "\n";
        echo "- - - - - -\n";
    }
}
echo "<!--- END -->";

Выход для 7.1.25 - 7.3.4

<!--- BEGIN -->
Name: object 1
Code: y001
Date: 2018-01-01T23:00:00-0600
- - - - - -
Name: object 2
Code: y002
Date: 2018-01-01T23:00:00-0600
- - - - - -
<!--- END -->

РАБОЧАЯ ДЕМО: https://3v4l.org/ajnOG

1 голос
/ 24 апреля 2019

Этот скрипт может помочь вам разработать и вывести желаемую строку.Работает на $element["B"].Вы можете просто написать аналогичный foreach для других элементов ваших массивов, таких как $element["A"].

$url = './data.json';
$data = file_get_contents($url);
$output = "<!--- File contents -->\n";
$contents = json_decode($data, true);
$output .= "<!--- Associative Array -->\n";

$output .= "<!--- BEGIN -->\n";
foreach ($contents as $elements) {
    if (!$elements["B"]) {continue;} // You might remove this and add other elements of your inputs such as $elements["A"]
    foreach ($elements["B"] as $key => $element) {
        $output .= "Name: " . $element['name'] . "\n";
        $output .= "Code: " . $element['code'] . "\n";
        $output .= "Date: " . $element['date'] . "\n";
        $output .= "- - - - - -\n";
    }

}
$output .= "<!--- END -->\n";

echo $output;

Вам может не потребоваться выводить строку за строкой, вы можете сохранить ее в переменной, такой как $output, и в конце echo $output;.

Вывод:

<!--- File contents -->
<!--- Associative Array -->
<!--- BEGIN -->
Name: object 1
Code: y001
Date: 2018-01-01T23:00:00-0600
- - - - - -
Name: object 2
Code: y002
Date: 2018-01-01T23:00:00-0600
- - - - - -
<!--- END -->
...