PHP / JSON - leeren String überspringen

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

sveka

Mitglied
26 Mai 2006
154
1
18
34
Hallo, ich arbeite aktuell mit JSON. Da bin ich allerdings noch recht unbedacht. Daher bräuchte ich mal wieder einen Denkanstoss.

Folgende Problemstellung.

Ich habe folgende JSON Struktur.

Code:
array(2) {
  ["@odata.context"]=>
  string(59) "https://graph.microsoft.com/v1.0/$metadata#directoryObjects"
  ["value"]=>
  array(25) {
    [0]=>
    array(9) {
      ["@odata.type"]=>
      string(21) "#microsoft.graph.user"
      ["id"]=>
      string(36) "WERT"
      ["businessPhones"]=>
      array(0) {
      }
      ["displayName"]=>
      string(12) "WERT"
      ["givenName"]=>
      string(5) "WERT"
      ["mail"]=>
      string(21) "WERT"
      ["preferredLanguage"]=>
      string(5) "de-DE"
      ["surname"]=>
      string(6) "WERT"
      ["userPrincipalName"]=>
      string(21) "WERT"
    }

Das auslesen und ansprechen klappt super. :) Wie aber kann ich beim auslesen feststellen, ob es einen Zweig überhaupt gibt? Denn in der JSON gibt es nicht bei allen Datensätzen den Zweig ["businessPhones"] bzw. ist er leer.

Bei der normalen Ausgabe habe ich mir mit "!isset" beholfen. Dies klappt auch ganz gut. Aber spätestens wenn ich die Daten in die Datenbank übernehmen will, meckert er bei dem Zweig wie folgt:

Notice: Undefined offset: 3 inD:\xampp\htdocs\independa\intern\json_auslesen.phpon line45

Dies aber nur, wenn er leer oder nicht vorhanden ist. In die Datenbank trägt er die vorhanden Werte sauber ein. Wie kann ich diese Fehlermeldung abstellen?

DANKE
 

sveka

Mitglied
26 Mai 2006
154
1
18
34
Den möchte ich natürlich nicht verschweigen. Ich habe es bisher wie folgt versucht.

Das ist der Teil vom businessPhones, welcher Probleme macht.

Code:
$json_file = file_get_contents("../json/import/mitarbeiter.json");
$JSON = json_decode($json_file, true);

$anzahl_inhalte = count($JSON['value']);

$i = 0;
while($i < $anzahl_inhalte) 
{

            ###################### businessPhones ############################
            if(!isset($JSON['value'][$i]['businessPhones'][0]))
            {
                echo "<td><input type='hidden' value='' name='businessPhones[]'></td>";
            }
            else
            {
            ?>
            <td><input type="hidden" value="<?php echo $JSON['value'][$i]['businessPhones'][0]; ?>" name="businessPhones[]"><?php echo $JSON['value'][$i]['businessPhones'][0]; ?></td> 
            <?php
            }
            } // Ende while
            ?>

Ich gebe es in einer Tabelle aus, daher das "hidden" als input-field für ein FORM.

Dies ist der Teil nach dem Absenden des FORMs.

Code:
if(isset($_POST['json_nach_db']))
{
    include('../inc/db_config.php');
    $i = 0;
    $anzahl_i = $_POST['anzahl'];

    while($i < $anzahl_i)
    {
        $ms_id = $_POST['id_ms'][$i]; 
        $displayName = $_POST['displayname'][$i];
        $givenName = $_POST['givenName'][$i];
        $surname = $_POST['surname'][$i];
        $mail = $_POST['mail'][$i];
        $mobilePhone = $_POST['mobilePhone'][$i];
        $preferredLanguage = $_POST['preferredLanguage'][$i];
        $businessPhones = $_POST['businessPhones'][$i];
        $officeLocation = $_POST['officeLocation'][$i];
        $jobTitle = $_POST['jobTitle'][$i];
        $userPrincipalName = $_POST['userPrincipalName'][$i];

        // DATEN in der Schleife eintragen
        $sql = $db1->Prepare("INSERT INTO mitarbeiter_ms_abgleich (id_ms, businessPhones , displayName, givenName, jobTitle , mail , mobilePhone , officeLocation , preferredLanguage , surname, userPrincipalName , timestamp) 
        VALUES ('$ms_id' , '$businessPhones' , '$displayName' , '$givenName' , '$jobTitle' , '$mail' , '$mobilePhone' , '$officeLocation' , '$preferredLanguage' , '$surname' , '$userPrincipalName' , NOW() )");
       
 $sql->execute();
    $i++;
    }
}

Es funktioniert wie gesagt bei ALLEN ausser bei businessPhones. Da bringt er o.g. Fehlermeldung.

Notice: Undefined offset: 3 inD:\xampp\htdocs\independa\intern\json_auslesen.php on line45

Vielleicht habt ihr eine Idee.
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.590
185
63
Ich vermute mal, es geht um
PHP:
$JSON['value'][$i]['businessPhones'][0]
Dann stellt sich doch die Frage, ob
PHP:
$JSON['value'][$i]
überhaupt existiert.
 

sveka

Mitglied
26 Mai 2006
154
1
18
34
Stimmt. Ein guter Hinweis. Dann werde ich

PHP:
$JSON['value'][$i]

das mal mit überprüfen. DANKE
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.590
185
63
Dann werde ich das mal mit überprüfen
Würde ich nicht machen, sondern die while-Schleife durch eine foreach-Schleife ersetzen, dann kann es dir egal sein, ob $JSON['value'][$i]
existiert.
PHP:
foreach($JSON['value'] as $value)
{
  ###################### businessPhones ############################
  if(!isset($value['businessPhones'][0]))
      echo "<td><input type='hidden' value='' name='businessPhones[]'></td>";
  else
    echo "<td><input type='hidden' value='" . $value['businessPhones'][0]. "' name='businessPhones[]'>" . $value['businessPhones'][0]; . "</td>"
}
 

sveka

Mitglied
26 Mai 2006
154
1
18
34
Ich nutze grundsätzlich gerne while-Schleifen. Warum kann ich gar nicht genau sagen. ;)

Aber ich werde es mit foreach probieren. Ich danke Dir.