【问题标题】:multidimensional Array php多维数组php
【发布时间】:2015-11-04 22:24:10
【问题描述】:

我正在尝试构建多维来获取 json,但它变得有点复杂。当然有更简单的方法可以做到这一点。这是我的代码。

$rows = array();
$idx = 0;
$sql = "SELECT products, GROUP_CONCAT(title,',' ,price SEPARATOR ', ' ) prods FROM mylist GROUP BY products";       
$query = mysqli_query($con, $sql); 
while($row = mysqli_fetch_assoc($query)){
    $rows[$idx]['products'] = $row['products'];
    $title = explode(',',$row['prods']);
    $rows[$idx]['prods'] = $title;
    $idx++;
};
echo '<pre>' . var_export($rows, true) . '</pre>';
echo json_encode($rows);

它给了我这个结果

array (
  0 => 
  array (
    'prods' => 
    array (
      0 => 'title 4',
      1 => '4',
      2 => ' title 1',
      3 => '1',
    ),
  ),
  1 => 
  array (
    'prods' => 
    array (
      0 => 'title 2',
      1 => '21',
    ),
  ),
  2 => 
  array (
    'prods' => 
    array (
      0 => 'title 3',
      1 => '3',
    ),
  ),
)
[{"prods":["title 4","4"," title 1","1"]},{"prods":["title 2","21"]},{"prods":["title 3","3"]}]

但我想要这样

    array (
  0 => 
  array (
    'prods' => 
    array (
      array(title => 'title 4', price => '4'),
      array(title => ' title 1', price => '1'),
    ),
  ),
  1 => 
  array (
    'prods' => 
    array (
      array(title => 'title 2', price => '21'),
    ),
  ),
  2 => 
  array (
    'prods' => 
    array (
      array(title => 'title 3', price => '3'),
    ),
  ),
)



    [
    {
        "prods": [
            {
                "title": "title 4",
                "price": "4"
            },
            {
                "title": "title1",
                "price": "1"
            }
        ]
    },
    {
        "prods": [
            {
                "title": "title2",
                "price": "21"
            }
        ]
    },
    {
        "prods": [
            {
                "title": "title3",
                "price": "3"
            }
        ]
    }
]

所以,不知道如何混合数组上的爆炸数据以获得正确的 json 编码。

【问题讨论】:

  • 该代码不会产生该输出。
  • 你是放弃了还是怎么了?
  • 仍在努力...
  • 看起来库恩删除了他的答案

标签: php arrays json mysqli


【解决方案1】:

您可以在 $title 数组上执行 foreach,如果键是偶数,则使用所需的键构建输出数组。在下面我编辑用你的 db 查询替换了 json 以便完整的示例可以在没有 sql 查询的情况下包含在内。

$rows = array();
$idx = 0;
$data = json_decode('[{"products":"the product", "prods":"title 4,4,title 1,1"},{"products":"the product", "prods":"title 2,21"},{"products":"the product", "prods":"title 3,3"}]', true);
foreach ($data as $row)
{
  $rows[$idx]['products'] = $row['products'];
  $title = explode(',',$row['prods']);
  foreach ($title as $k => $v) {
    // check if even
    if ($k % 2 == 0) $rows[$idx]['prods'][] = array('title' => $v, 'price' => $title[$k+1]);
  }
  $idx++;
};
echo '<pre>' . var_export($rows, true) . '</pre>';
echo json_encode($rows);

会输出以下内容

array (
  0 => 
  array (
    'products' => 'the product',
    'prods' => 
    array (
      0 => array ('title' => 'title 4','price' => '4'),
      1 => array ('title' => 'title 1','price' => '1'),
    ),
  ),
  1 => 
  array (
    'products' => 'the product',
    'prods' => 
    array (
      0 => array ('title' => 'title 2','price' => '21'),
    ),
  ),
  2 => 
  array (
    'products' => 'the product',
    'prods' => 
    array (
      0 => array ('title' => 'title 3','price' => '3'),
    ),
  ),
)

【讨论】:

  • 谢谢特里斯坦,但产品可能有两个以上的产品,所以想知道我是否必须在循环内循环。就像我已经有产品循环一样,现在我在产品循环中有循环标题和价格
  • 看起来不错的特里斯坦,我得到了类似的解决方案,但略有不同,我在下面发布答案 2。你能从性能的角度来判断哪个更好吗?谢谢
【解决方案2】:

根据 Tristan 之前的建议,我能够使用以下代码获得预期的结果,但不确定这是否是最好的方法。

$rows = array();
$idx = 0;
$sql = "SELECT products, GROUP_CONCAT(title,',',price SEPARATOR ';') prods FROM mylist GROUP BY products";       
$query = mysqli_query($con, $sql); 

while($row = mysqli_fetch_assoc($query)){
    $prods = explode(';',$row['prods']);
    foreach ($prods as $key => $value) {
        $expValue = explode(',',$value);
        $rows[$idx]['prods'][] = array('title' => $expValue[0], 'price' => $expValue[1]);
    };
    $idx++;
};
echo '<pre>' . var_export($rows, true) . '</pre>';

echo json_encode($rows);

【讨论】:

  • 看起来不错 @alflashy 并且通过更改 sql 查询可能更具可读性。
  • 感谢您的帮助@Tristan
猜你喜欢
  • 2011-09-20
  • 2022-01-07
  • 2013-03-04
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多