Cristian Urrutia
Cristian Urrutia

Reputation: 23

Extract key elements from Json in PHP

I need to work with a Json file inside PHP, in such a way that I can iterate inside a specific key of its main elements.

I have this example Json 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"
    }
]}]

As far is I know, I can handle a Json file (whitout nested elements in main keys A & B) like this:

<?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 -->";
?>

What I'm trying to do is to call a loop inside a given key, for example, a loop for all elements correspondig to 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"
    }

It could be extracting those elements to a second associative array or another suggested aproach...

And the expected result needs to be:

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

Ignoring A elements

Upvotes: 2

Views: 114

Answers (3)

Josua M C
Josua M C

Reputation: 3158

Please try this onestopfile. you may try it by yourself by copy this 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 "</pre>";


echo "<!--- BEGIN -->";
echo "<pre>";
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 "</pre>";
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
- - - - - -
- - - - - -

Upvotes: 1

A l w a y s S u n n y
A l w a y s S u n n y

Reputation: 38502

You can do it this way with foreach() loops

$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 -->";

Output for 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 -->

WORKING DEMO: https://3v4l.org/ajnOG

Upvotes: 2

Emma
Emma

Reputation: 27723

This script might help you to design and output the desired string. It works for $element["B"]. You can simply write a similar foreach for other elements of your arrays such as $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;

You may not need to echo line by line, you can store it in a variable such as $output, and at the end echo $output;.

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 -->

Upvotes: 2

Related Questions