【问题标题】:json_encode from php array: how do I adjust my php so my array is correct?来自 php 数组的 json_encode:如何调整我的 php 以使我的数组正确?
【发布时间】:2013-11-30 04:31:25
【问题描述】:

我正在尝试从发布的值创建一个 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

【问题讨论】:

    标签: php arrays json for-loop coffeescript


    【解决方案1】:

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

    所以为了完成你想要的,你会:

    <?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。
    但是,这种方法有点笨拙且不可靠。

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

    &lt;input type="text" name="network[0][network_type]" /&gt;&lt;input type="text" name="network[0][network_url]" /&gt;

    &lt;input type="text" name="network[1][network_type]" /&gt;&lt;input type="text" name="network[1][network_url]" /&gt;

    我会生成这样的 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);
    

    【讨论】:

    • 谢谢!我试一试...我刚刚更新了我的帖子,以便您可以查看输入字段的上下文
    • 添加了可能有帮助的咖啡脚本片段
    • 将以下文件在 cmets 中发布到 Deryck
    • 我的答案是正确的,唯一的区别是它返回一个数组数组而不是一个 StdClass 对象数组,您可以在 for 循环中创建它:$obj = new StdClass(); $obj-&gt;network_type = $networkType[$i]; $obj-&gt;network_url = $networkUrl[$i]; $networkData[] = $obj
    • 是的,做到了:) ...我仍然需要进行字符串替换以删除类周围的括号,因此 POST 只会在花括号中,允许我解码和填充表单字段
    【解决方案2】:

    您可以使用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 的上下文是什么,但它们都是数组,并且循环遍历每个单独的值是做什么的。如果没有其余代码,很难获得更具体的代码,但希望这会为您指明正确的方向。

    【讨论】:

    • 谢谢!我试一试...我刚刚更新了我的帖子,以便您可以查看输入字段的上下文
    • 添加了可能有帮助的咖啡脚本片段
    • 抱歉,没有足够的代码让我离开。最初的问题不仅限于咖啡,但我猜我不认识的函数和变量可能来自那里。如果我得到完整的脚本,我会再看一遍。
    • 这里是要查看的文件。咖啡:cl.ly/code/0T08012v290a 控制器:cl.ly/code/3A3g0E3F3o3l 视图:cl.ly/code/3y242I0L2k1J
    • 我注意到,如果我查看 $social_networks 的 firelog,我会看到双方括号包裹着我的 json 数组: [[{"network_type":"Facebook","network_url":"fb.com\ /user"},{"network_type":"Twitter","network_url":"@user"}]] 在重新填充表单时会破坏我的代码;而手动删除一组括号(在 sql 字段中似乎可以解决问题:[{"network_type":"Facebook","network_url":"fb.com\/user"},{"network_type":"Twitter" ,"network_url":"@user"}]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2013-11-08
    • 2017-02-10
    • 2019-06-01
    • 2011-04-03
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多