Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON结构PHP-奇怪_Php_Arrays_Json - Fatal编程技术网

JSON结构PHP-奇怪

JSON结构PHP-奇怪,php,arrays,json,Php,Arrays,Json,我正在使用GoogleTagManagerAPI(v2),并试图向我现有的JSON数组添加一些新行。首先,我在向JSON对象添加数据时遇到了一些问题,因为数据显示在最后一行,而不是对象本身 现在我改变了我的代码,但是数据看起来不像它在对象内部,但是我现在离它有点近了。这就是我的JSON对象现在的样子: JSON: { "Account2": [{ "accountId": "17467*****", "containerId": "745****",

我正在使用GoogleTagManagerAPI(v2),并试图向我现有的JSON数组添加一些新行。首先,我在向JSON对象添加数据时遇到了一些问题,因为数据显示在最后一行,而不是对象本身

现在我改变了我的代码,但是数据看起来不像它在对象内部,但是我现在离它有点近了。这就是我的JSON对象现在的样子:

JSON:

{
    "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这个网站上的一个文本字段要比试验自己的代码、测试一些东西以及实际看到结果要困难得多:)