JSON结构PHP-奇怪
我正在使用GoogleTagManagerAPI(v2),并试图向我现有的JSON数组添加一些新行。首先,我在向JSON对象添加数据时遇到了一些问题,因为数据显示在最后一行,而不是对象本身 现在我改变了我的代码,但是数据看起来不像它在对象内部,但是我现在离它有点近了。这就是我的JSON对象现在的样子: JSON:JSON结构PHP-奇怪,php,arrays,json,Php,Arrays,Json,我正在使用GoogleTagManagerAPI(v2),并试图向我现有的JSON数组添加一些新行。首先,我在向JSON对象添加数据时遇到了一些问题,因为数据显示在最后一行,而不是对象本身 现在我改变了我的代码,但是数据看起来不像它在对象内部,但是我现在离它有点近了。这就是我的JSON对象现在的样子: JSON: { "Account2": [{ "accountId": "17467*****", "containerId": "745****",
{
"Account2": [{
"accountId": "17467*****",
"containerId": "745****",
}, 3, 3, 4, {
"accountId": "17467*****",
"containerId": "751****",
}, 1, 1, 2],
"Account 1": [{
"accountId": "17661*****",
"containerId": "748****",
}, 2, 1, 1],
"GTMdocx": [{
"accountId": "21200*****",
"containerId": "803****",
}, 0, 0, 1],
"Account3": [{
"accountId": "21281*****",
"containerId": "803****",
}, 0, 0, 0]
}
static public function listAllContainers() {
try { //Because some containers might not have live-version
$containers[] = array();
foreach (self::listAccounts()->account as $accountKey => $account) {
foreach (self::listAccountsContainers($account["path"]) as $account_container) {
$containers[$account['name']][] = $account_container;
$container_version = self::listAccountsContainersVersion($account_container['path']);
$containers[$account['name']][] = count($container_version['tag']);
$containers[$account['name']][] = count($container_version['trigger']);
$containers[$account['name']][] = count($container_version['variable']);
}
}
$filtered_array = (object)array_filter((array)$containers); // Removes empty object
return $filtered_array;
} catch (\Exception $e) {
return $e->getCode();
}
}
如您所见,对象的结构如下:1) 帐户名
2) 在
Accountname
内部,我们有accountId
和containerId
3) 在一个Accountname对象的最后,我们有一些数字(count),问题是它看起来像这样: 我希望JSON对象的外观如下所示:
{
"Account2": [{
"accountId": "17467*****",
"containerId": "745****",
"tags": "3",
"triggers": "3",
"variables": "4"
}, {
"accountId": "17467*****",
"containerId": "751****",
"tags": "3",
"triggers": "3",
"variables": "4"
}],
"Account 1": [{
"accountId": "17661*****",
"containerId": "748****",
"tags": "2",
"triggers": "1",
"variables": "1"
}],
"GTMdocx": [{
"accountId": "21200*****",
"containerId": "803****",
"tags": "0",
"triggers": "0",
"variables": "1"
}],
"Account3": [{
"accountId": "21281*****",
"containerId": "803****",
"tags": "0",
"triggers": "0",
"variables": "0"
}]
}
您可以看到对象中的数字有一个键,然后是值
这是我的PHP代码:
{
"Account2": [{
"accountId": "17467*****",
"containerId": "745****",
}, 3, 3, 4, {
"accountId": "17467*****",
"containerId": "751****",
}, 1, 1, 2],
"Account 1": [{
"accountId": "17661*****",
"containerId": "748****",
}, 2, 1, 1],
"GTMdocx": [{
"accountId": "21200*****",
"containerId": "803****",
}, 0, 0, 1],
"Account3": [{
"accountId": "21281*****",
"containerId": "803****",
}, 0, 0, 0]
}
static public function listAllContainers() {
try { //Because some containers might not have live-version
$containers[] = array();
foreach (self::listAccounts()->account as $accountKey => $account) {
foreach (self::listAccountsContainers($account["path"]) as $account_container) {
$containers[$account['name']][] = $account_container;
$container_version = self::listAccountsContainersVersion($account_container['path']);
$containers[$account['name']][] = count($container_version['tag']);
$containers[$account['name']][] = count($container_version['trigger']);
$containers[$account['name']][] = count($container_version['variable']);
}
}
$filtered_array = (object)array_filter((array)$containers); // Removes empty object
return $filtered_array;
} catch (\Exception $e) {
return $e->getCode();
}
}
希望你能理解我的问题。没有那么多关于数组/JSON的经验,所以我的解释可能不是很好。
谢谢
更新:使用
$containers[$account['name']['tag']=count($container_version['tag'])
给了我这个JSON:(PS:ive从JSON中删除了一些,所以不会太长,这使得JSON无效)
现在,每个“帐户”可以有多个“容器”(accountId,containerId),使用此方法不会将数据存储在对象本身中。如果您有一个数组,可以使用以下语法向其添加一个key:value对:
$array['key'] = 'value';
//array('key' : 'value')
如果不指定键,它只会添加值:
$array[] = 'value';
//array('value')
最后一部分是您现在正在做的事情,但是您需要将它添加到$containers[…]数组中。您要做的是首先将值添加到$account_容器数组中,然后将该数组添加到$containers[…]数组中。把这个放在内部foreach中:
$container_version = self::listAccountsContainersVersion($account_container['path']);
//Add values to account_container
$account_container['tag'] = count($container_version['tag']);
$account_container['trigger'] = count($container_version['trigger']);
$account_container['variable'] = count($container_version['variable']);
// Add account_container to your $containers[..] array
$containers[$account['name']][] = $account_container;
我没有修改原始的
$account\u容器
,就整合了另一个解决方案
我已将新数据添加到一个新数组$account\u container\u extra
,并在将其添加到$container
数组时将其与$account\u container
合并
也许这会对你更好,或者给你一些其他的想法
static public function listAllContainers() {
try { //Because some containers might not have live-version
$containers[] = array();
foreach (self::listAccounts()->account as $accountKey => $account) {
foreach (self::listAccountsContainers($account["path"]) as $account_container) {
$container_version = self::listAccountsContainersVersion($account_container['path']);
$account_container_extra = [
'tag' => count($container_version['tag']),
'trigger' => count($container_version['trigger']),
'variable' => count($container_version['variable'])
];
$containers[$account['name']][] = array_merge($account_container, $account_container_extra);
}
}
$filtered_array = (object)array_filter((array)$containers); // Removes empty object
return $filtered_array;
} catch (\Exception $e) {
return $e->getCode();
}
}
为什么要投否决票?我违反了一些规则吗?你可以简单地给它起一个这样的名字
$containers[$account['name']]['tag']=count($container_version['tag'])
(请参阅第一个“标记”)或将其放入$account\u容器中
数组,如$account\u容器['tag']=…
@xander'$containers[$account['name']]['tag']=count($container\u version['tag']);'给我的不是“account1”中的对象。如果你能看到我想要的是它在“集装箱”下,而不是一个自己的对象。请看illustrateIt的更新答案这只是一个例子,我给了你另一个更像下面@user3053216的答案,应该能更好地满足你的需要。使用@user305。。。解决方案没有显示任何内容。我尝试使用此代码,但JSON中没有显示“标记”、“触发器”、“变量”计数?@Asim在您的原始代码中,您可以$containers[$account['name']][=$account\u container
因此您将容器添加到JSON中,因此如果您将一些值添加到$account\u容器中
,它应该可以工作。也许在代码的幕后还发生了其他错误或奇怪的逻辑!?是的,阅读此代码应该可以工作。很奇怪。这是可行的,但只是一个小问题,即如果1account有3个容器,那么所有3个容器都会得到相同的计数,这是错误的。但在“帐户”级别上,它工作得非常完美,只是在JSON块中的“容器”级别上不一样。听起来,每个帐户容器都有一个引用,而不是一个对象。引用被其他一些代码重用,很难说没有看到所有的代码。您可以使用调试器一步一步地检查代码,以查看循环中实际发生的情况。因此,要解决这个问题,您可以使用新的临时数组,而不是扩展$account\u container
,并将其与array\u merge
合并。如果您了解PHP中的一些数组基础知识,这并不难。:)我试试看,然后回来。如果我在这个过程中遇到问题,希望你能帮助我。感谢帮助:)警告:数组#u merge():参数#1不是(…)中的数组:(我会尝试制作一个JSFIDLE也许你的$account\u container
不是一个数组,而是一个类对象?我认为JSFIDLE对你的PHP项目不起作用。你可以将类转换成数组,或者提取你需要的类成员并从中构建一个数组。这些信息在你最初的问题中是看不到的,这很容易呃,如果你知道你的其他代码以及它们是如何协同工作的,当然,但我假设你还没有编写这些代码?这是由我@xander编写的,你还需要什么其他代码?“$account_container”是一个对象。如果你自己编写了所有这些代码,你应该对如何解决这个警告有一些想法。你知道我写的代码是什么吗n这个网站上的一个文本字段要比试验自己的代码、测试一些东西以及实际看到结果要困难得多:)