将数据插入数组 - 不要在json_encode中显示数字

时间:2017-11-28 19:48:31

标签: php arrays

我有一个2D的数组$fields。它不是标准类,而是从数据库中获取的。我需要做的是:将数据插入另一个数组并给出这样的结果(JSON编码):

"fields": {
    "0": [{
        "field": "text",
        "name": "link",
        "label": "Link",
        "required": true,
        "type": "string"
    }, {
        "field": "xx",
        "name": "xx",
        "label": "xx",
        "required": xx,
        "type": "xx"
    }],
    "1": {
        {
            "field": "xx",
            "name": "xx",
            "label": "xx"
        },
        {
            "field": "xx",
            "name": "xx",
            "label": "xx"
        }
    }
}

我得到的是:

"fields": {
    "0": [{
        "field": "xx",
        "name": "xx",
        "label": "xx",
        "required": xx,
        "type": "xx"
    }, {
        "field": "xx",
        "name": "xx",
        "label": "xx",
        "required": true,
        "type": "xx"
    }],
    "1": {
        "2": {
            "field": "xx",
            "name": "xx",
            "label": "xx"
        },
        "3": {
            "field": "xx",
            "name": "xx",
            "label": "xx"
        },
    }
}

现在我需要将数据插入$f数组,然后将$f数组插入数组$r。要像这样打印"1": {"0": {,我可以使用:

$r = array(
    'f' => (object) $f
);

PHP代码:

foreach($fields AS $c => $field) {
    $f[$field['id']][$c] = array(
        "field" => $field['field'],
        "name" => $field['name'],
        "label" => $field['label'],
    );
    if($field['required'] == "1") {
        $f[$field['id']][$c]['required'] = true;
    }
}

问题主要是$c,如果我只是[]而不是[$c],它会生成另一个数组。我使用JavaScript代码编码的JSON,并且JSON编码结果都有效,但我需要第一个。

1 个答案:

答案 0 :(得分:0)

您的第一个JSON输出无效。我希望将其复制到问题中只是一个错字。

"1": {
    {

应为"1": [ {。 如果是这种情况,您只需在代码后重新编号数组:

foreach($f as &$ff) $ff = array_values($ff);
unset($ff);

或者,如果您不知道或不喜欢参考文献:

foreach($f as $key => $ff) $f[$key] = array_values($ff);

然后json_encode应该创建你想要的输出。 (如果键是数字的,PHP数组会产生JSON数组,从0开始,没有空洞;否则它们将被编码为JSON对象)

如果你想避免使用另一个循环:

foreach($fields AS $field) {
  $f[$field['id']][] = array(
    "field" => $field['field'],
    "name" => $field['name'],
    "label" => $field['label'],
  );

  //hacky way to get the key of the array just created
  $c = count($f[$field['id']) - 1; 
  if($field['required'] == "1") {
    $f[$field['id']][$c]['required'] = true;
  }
}

或者首先创建数组并将其插入到最后(稍微清洁一点):

foreach($fields => $field) {
   $tmp = array(
    "field" => $field['field'],
    "name" => $field['name'],
    "label" => $field['label'],
  );
  if($field['required'] == "1") {
    $tmp['required'] = true;
  }
  $f[$field['id']][] = $tmp;
}