Разбор Json в таблицу php приводит к неопределенному индексу - PullRequest
0 голосов
/ 12 мая 2018

Я обращаюсь к API для "ConnectWise".данные поступают в формате JSON.я был в состоянии разобрать данные в таблицу с помощью PHP.однако пустые поля в JSON приводят к неопределенному индексу .Это происходит для некоторых товаров без веб-сайта или адреса, например.остальное обнаруживается нормально.Любая помощь или вклад будут оценены.

Вот мой код для получения данных от Connectwise:

function get_companies(){

   $curl = curl_init();
   curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
   curl_setopt($curl, CURLOPT_URL, "https://api- 
   na.myconnectwise.net/v4_6_release/apis/3.0/company/companies");
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 );
   curl_setopt($curl, CURLOPT_HTTPHEADER, array(

  "Authorization: Basic (OUR KEY)",

   'Content-type: application/json'

       ));

$result = curl_exec($curl);
curl_close($curl);
$decoded =  json_decode($result,true);
return $decoded;
}

И для отображения данных:

function list_all_accounts(){

    $accounts = get_companies();

    if ( !empty ($accounts)){
            foreach ($accounts as $account) {

                {
        echo "
                    </td>
                    <td>
                        $account[id]
                    </td>
                    <td>
                        $account[name]
                    </td>
                    <td>
                        $account[addressLine1]
                    </td>
                    <td>
                         $account[phoneNumber]
                    </td>
                    <td>
                         $account[website]
                    </td>   
                    <td>
                        $account[name]
                    </td>                       
                    </tr>";
            }
    }
   }
 }

Обновление - образец Json

    [
    {
        "id": 250,
        "identifier": "company name ",
        "name": "company name",
        "status": {
            "id": 1,
            "name": "Active",
            "_info": {
                "status_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies/statuses/1"
            }
        },
        "type": {
            "id": 1,
            "name": "Client",
            "_info": {
                "type_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies/types/1"
            }
        },
        "addressLine1": "address line 1",
        "city": "New York",
        "state": "NY",
        "zip": "11111",
        "country": {
            "id": 1,
            "name": "United States",
            "_info": {
                "country_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/countries/1"
            }
        },
        "phoneNumber": "123456789",
        "faxNumber": "",
        "website": "www.site.com",
        "territoryId": 2,
        "accountNumber": "",
        "dateAcquired": "2006-06-21T04:00:00Z",
        "sicCode": {
            "id": 1209,
            "name": "consulting"
        },
        "annualRevenue": 0,
        "timeZone": {
            "id": 1,
            "name": "GMT-5/Eastern Time: US & Canada",
            "_info": {
                "timeZoneSetup_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/system/timeZoneSetups/1"
            }
        },
        "leadFlag": false,
        "unsubscribeFlag": false,
        "userDefinedField5": "1",
        "taxCode": {
            "id": 8,
            "name": "Tax-State",
            "_info": {
                "taxCode_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/finance/taxCodes/8"
            }
        },
        "billingTerms": {
            "id": 1,
            "name": "Net 30 days"
        },
        "billToCompany": {
            "id": 250,
            "identifier": "comp1 ",
            "name": "company1.",
            "_info": {
                "company_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies/250"
            }
        },
        "billingSite": {
            "id": 1291,
            "name": "company1",
            "_info": {
                "site_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies"
            }
        },
        "invoiceDeliveryMethod": {
            "id": 1,
            "name": "Mail"
        },
        "deletedFlag": false,
        "mobileGuid": "1df91371-6d7a-4778-ab81-f3e7761f5211",
        "currency": {
            "id": 7,
            "symbol": "$",
            "isoCode": "USD",
            "name": "US Dollars",
            "_info": {
                "currency_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/finance/currencies/7"
            }
        },
        "_info": {
            "lastUpdated": "2018-04-02T16:36:05Z",
            "updatedBy": "user1",
            "dateEntered": "2006-06-21T16:04:59Z",
        }
    },
     {
        "id": 250,
        "identifier": "company name ",
        "name": "company name",
        "status": {
            "id": 1,
            "name": "Active",
            "_info": {
                "status_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies/statuses/1"
            }
        },
        "type": {
            "id": 1,
            "name": "Client",
            "_info": {
                "type_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies/types/1"
            }
        },
        "addressLine1": "address line 1",
        "city": "New York",
        "state": "NY",
        "zip": "11111",
        "country": {
            "id": 1,
            "name": "United States",
            "_info": {
                "country_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/countries/1"
            }
        },
        "phoneNumber": "123456789",
        "faxNumber": "",
        "website": "www.site.com",
        "territoryId": 2,
        "accountNumber": "",
        "dateAcquired": "2006-06-21T04:00:00Z",
        "sicCode": {
            "id": 1209,
            "name": "consulting"
        },
        "annualRevenue": 0,
        "timeZone": {
            "id": 1,
            "name": "GMT-5/Eastern Time: US & Canada",
            "_info": {
                "timeZoneSetup_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/system/timeZoneSetups/1"
            }
        },
        "leadFlag": false,
        "unsubscribeFlag": false,
        "userDefinedField5": "1",
        "taxCode": {
            "id": 8,
            "name": "Tax-State",
            "_info": {
                "taxCode_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/finance/taxCodes/8"
            }
        },
        "billingTerms": {
            "id": 1,
            "name": "Net 30 days"
        },
        "billToCompany": {
            "id": 250,
            "identifier": "comp1 ",
            "name": "company1.",
            "_info": {
                "company_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies/250"
            }
        },
        "billingSite": {
            "id": 1291,
            "name": "company1",
            "_info": {
                "site_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/company/companies"
            }
        },
        "invoiceDeliveryMethod": {
            "id": 1,
            "name": "Mail"
        },
        "deletedFlag": false,
        "mobileGuid": "1df91dd371-6d7addd-4778s-ab81-f3e7761f5211",
        "currency": {
            "id": 7,
            "symbol": "$",
            "isoCode": "USD",
            "name": "US Dollars",
            "_info": {
                "currency_href": "https://api-na.myconnectwise.net/v4_6_release/apis/3.0/finance/currencies/7"
            }
        },
        "_info": {
            "lastUpdated": "2018-04-02T16:36:05Z",
            "updatedBy": "user1",
            "dateEntered": "2006-06-21T16:04:59Z",
            "enteredBy": "CONVERSION",
        }
    }
]

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Согласно вашему комментарию, возможно, что некоторые свойства, которые вы используете в своем HTML, не являются частью JSON, который вы получаете. Это означает, что вы обращаетесь к индексу массива, который не установлен, например, с $account[website].

Я вижу два решения для этого:

  1. Выводить данные, только если они установлены в массиве:

    echo '<td>'.(isset($account['website']) ? $account['website'] : '').'</td>';
    
  2. Используйте массив со значениями по умолчанию для всех значений в качестве основы для вашего $account массива и объедините их:

    $base = [
        'website' => 'no website',
        'phoneNumber' => '',
    ];
    
    foreach ($accounts as $account) {
        // this will override all elements of $base with them of $account,
        // but only if they are present in $account
        $account = array_merge($base, $account);
    
        // ... your output here ...
    }
    
0 голосов
/ 12 мая 2018

json_decode() и https://jsonlint.com/ оба жалуются на запятую после значения в строках 95 и 194. Удаление их делает его действительным json, после чего ваш код работает, как только вы не забудете процитировать ключевые значения дляассоциативный массив.

Я удалил две запятых в json и сохранил их в виде файла, затем добавил кавычки для значений ключей в массиве и, наконец, удалил содержимое таблицы HTML и тому подобное (япросто запустив его в командной строке, чтобы увидеть результат).Должно быть легко положить обратно ...

<?php

function get_companies() {
    $j = file_get_contents("json.json");
    $jd = json_decode($j, true);
    return $jd;
}

$accounts = get_companies();
if (!empty($accounts)) {
    foreach ($accounts as $account) {
        echo  "\n".$account['id'] . "
              " . $account['name'] . "
              " . $account['addressLine1'] . "
              " . $account['phoneNumber'] . "
              " . $account['website'] . "
              " . $account['name']."\n\n";
    }
}
?>
...