Разбор Json в таблицу php приводит к неопределенному индексу

Я обращаюсь к 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",
}
}
]

1

Решение

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

Другие решения

Согласно вашему комментарию, возможно, что некоторые свойства, которые вы используете в своем 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

По вопросам рекламы [email protected]