来自php数组的json_encode:如何调整我的php以便我的数组是正确的?

时间:2013-11-16 21:00:25

标签: php arrays json for-loop coffeescript

我正在尝试从已发布的值创建一个php数组,然后使用json_encode来实现此目的:

[{"network_type":"facebook","network_url":"fb.com/name"},{"network_type":"twitter","network_url":"@name"},{"network_type":"instagram","network_url":"#name"}]

在json_decode之后看起来像:

array(
 [0] => stdClass(

 network_type = 'facebook'
 network_url = 'fb.com/name'
 )

 [1] => stdClass(

 network_type = 'twitter'
 network_url = '@name'
 )

 [2] => stdClass(

 network_type = 'instagram'
 network_url = '#name'
 )
)

我的php看起来像这样:

$social_data = array(

          'network_type'    => $this->input->post('network_type'),
          'network_url'     => $this->input->post('network_url')
    );

因此数组不按我想要的方式分组,而是按字段名称分组:

array(
['network_type'] => array(
  [0] => 'facebook'
  [1] => 'twitter'
  [2] => 'instagram'
)
['network_url'] => array(
  [0] => 'fb.com/name'
  [1] => '@name'
  [2] => '#name'
)

因此json_encode的结果没有按照我想要的方式分组:

 {"network_type":["facebook","twitter","instagram"],"network_url":["fb.com/name","@name","#name"]}

所以问题是......如何调整我的php,以便数组正确?

---这是输入字段:

<?php
        foreach ($social as $key => $value) {?>
         <p>
              <label for="network_type"><input type="text" size="20" name="network_type[]" value="<?php echo $value -> network_type; ?>" placeholder="Social Network" /></label>
              <label for="network_url"><input type="text" size="20" name="network_url[]" value="<?php echo $value -> network_url; ?>" placeholder="URL or Handle" /></label>
              <a class="remNetwork" href="#">Remove</a>
          </p>
      <?php } ?>

----最新更新:这是太近了!----- 好吧,由于某种原因(可能是我用这种或那种方式拙劣的东西),下面两种建议的方法都没有让我在那里......但是,两种方法的混合使我接近:

这个if / loop / array设置:

 $network_type    = (array)$this->input->post('network_type', true);
$network_url     = (array)$this->input->post('network_url', true);
$social_data = array();


if (($counter = count($network_type)) == count($network_url)){
for($i = 0;$i < $counter; $i++) {
    $social_data[$i] = array(
            'network_type'    => $this->input->post('network_type[$i]'),
            'network_url'     => $this->input->post('network_url[$i]'),
        );
  }
}

与此输入循环配对:

<?php
        foreach ($social as $key => $value) {
      ?>
         <p>
              <label for="network_type"><input type="text" size="20" name="network_type[]" value="<?php echo $value -> network_type; ?>" placeholder="Social Network" /></label>
              <label for="network_url"><input type="text" size="20" name="network_url[]" value="<?php echo $value -> network_url; ?>" placeholder="URL or Handle" /></label>
              <a class="remNetwork" href="#">Remove</a>
          </p>
      <?php } ?>

正在产生以下结果:

array(
  [0] =>  array(
    ['network_type'] => FALSE
    ['network_url'] => FALSE
  )
  [1] => array(
    ['network_type'] => FALSE
    ['network_url'] => FALSE
  )
  [2] => array(
    ['network_type'] => FALSE
    ['network_url'] => FALSE
  )
)

所以,我想如果我能弄清楚为什么这些值是错误的,那么我们就完成了! 感谢并感谢您的耐心和提前帮助...

- 再次更新---- 令我沮丧的是,我遗漏了一篇可能很重要的文章......当有多个社交网站时,咖啡脚本会动态创建表单字段:

$ ->


socialDiv = $("#social")
  i = $("#social p").size() + 1
  index = 0
  $("#addNetwork").click ->
$("<p><label for=\"network_type[]\"><input type=\"text\" id=\"network_type[]\" size=\"20\" name=\"network_type[]\" value=\"\" placeholder=\"Social Network\" /></label><label for=\"network_url[]\"><input type=\"text\" id=\"network_url[]\" size=\"20\" name=\"network_url[]\" value=\"\" placeholder=\"URL or Handle\" /></label> <a href=\"#\" class=\"remNetwork\">Remove</a></p>").appendTo socialDiv
i++
false
$(document).on "click", ".remNetwork", ->
      #$(".remNetwork").bind "click", ->
        if i > 1
          $(this).parent("p").remove()
          i--
        false

2 个答案:

答案 0 :(得分:0)

您可以使用for循环在将它们输入$social_data数组时进行迭代。这将是

for($i = 0;$i < $items.length;$i++) {
    $social_data[$i] = array(
            'network_type'    => $this->input->post('network_type[$i]'),
            'network_url'     => $this->input->post('network_url[$i]'),
        );

生成的数组如下所示:

$social_data[0] -> 
    'network_type' => 'facebook',
    'network_url' => 'fbook.com/user'
$social_data[1] ->
     ...etc

我不完全确定你获得network_type和url的上下文,但它们都是数组,并且每个单独值的循环都是做什么的。没有剩下的代码,很难得到更具体的内容,但希望这会指向正确的方向。

答案 1 :(得分:0)

在您的示例中,我可以假设network_typenetwork_url输入如下:
<input type="text" name="network_type[]" /><input type="text" name="network_url[]" />

所以为了达到你想要的目的,你会:

<?php
$networkType = (array)$this->input->post('network_type', true);
$networkUrl = (array)$this->input->post('network_url', true);

$networkData = array();
if (($counter = count($networkType)) == count($networkUrl)) {
    for ($i = 0; $i < $counter; ++$i) {
        $networkData[] = array(
            'network_type' => $networkType[$i],
            'network_url' => $networkUrl[$i]
        );
    }
}
?>

并且应该给你想要的json 但是,这种方法有点笨拙且不可靠。

相反,我会定义输入字段,如:

<input type="text" name="network[0][network_type]" /><input type="text" name="network[0][network_url]" />

<input type="text" name="network[1][network_type]" /><input type="text" name="network[1][network_url]" />

我将生成php数组,如:

<?php
$networkData = (array)$this->input->post('network', true);
?>

只是我的两分钱:)

L.E:
要使其详细并从数组中创建std对象,您将:

$networkData = array();
if (($counter = count($networkType)) == count($networkUrl)) {
    for ($i = 0; $i < $counter; ++$i) {
        $obj = new StdClass();
        $obj->network_type = $networkType[$i];
        $obj->network_url = $networkUrl[$i];
        $networkData[] = $obj;
    }
}
print_r($networkData);