【问题标题】:PHP PDO Query trying to create subarrays from valuePHP PDO查询试图从值创建子数组
【发布时间】:2021-08-04 07:30:47
【问题描述】:

我想弄清楚如何创建(子数组)?我不确定这是否是正确的术语,但我在下面列出了一些示例。

基本上,我想为每个度假村创建一个数组。在该数组中,我想要每个房间的数组/子数组。

感谢任何帮助。

<?php
$servername = "localhost";
$username = "root";
$password = "";

$dbh = new PDO("mysql:host=$servername;dbname=checkavail", $username, $password);

$checkin = $_POST['checkin'];
$checkout = $_POST['checkout'];
$occupants = $_POST['occupants'];
$sql=
"SELECT
MIN(staydate) AS checkin,
MAX(staydate) AS lastnight,
MIN(available) AS available,
ra.resort AS resortcode,
ri.resort AS resortname,
ri.room AS roomname,
ri.roomcode AS roomcode,
ri.view AS viewname,
SUM(ra.points) AS points,
ri.sqfoot AS sqfoot,
ri.description AS roomdescription,
ri.bedding AS bedding,
ri.amenities AS amenities,
ri.sleeps AS sleeps,
ri.sleep_details AS sleepdetails,
ri.layout_img AS layoutimg,
ri.room_img AS roomimg,
ri.roomimg_thumb AS roomimgthumb
FROM resort_availability AS ra
    LEFT JOIN room_info AS ri ON (ra.room = ri.roomcode)
WHERE staydate >= '$checkin' AND staydate < '$checkout'
AND sleeps >= '$occupants'
GROUP BY resortname, roomname
ORDER BY points
";
$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);



$return = [];
foreach ($result as $row) {
    $points = $row['points'];
    $price = $points*20;
    $pricefrmt = "$".number_format ($price, 2);
    $return[] = [ 
        'resort' => $row['resortname'],
        'room' => $row['roomname'],
        'price' => $pricefrmt
    ];
}
$dbh = null;

header('Content-type: application/json');
echo json_encode($return);
?>

这是当前输出:

[
  {
   "resort":"Resort1",
   "room":"DStudio",
   "price":"$2,560.00"
  },
  {
   "resort":"Resort1",
   "room":"TVilla",
   "price":"$3,980.00"
  },
  {
   "resort":"Resort1",
   "room":"1-Bedroom Villa",
   "price":"$5,460.00"
  },
  {
   "resort":"Resort1",
   "room":"2-Bedroom LO Villa",
   "price":"$7,040.00"
  },
  {
   "resort":"Resort1",
   "room":"2-Bedroom Villa",
   "price":"$7,040.00"
  },
  {
   "resort":"Resort1",
   "room":"3-Bedroom Villa",
   "price":"$15,620.00"
  },

  {
   "resort":"Resort2",
   "room":"DStudio",
   "price":"$2,560.00"
  },
  {
   "resort":"Resort2",
   "room":"TVilla",
   "price":"$3,980.00"
  },
  {
   "resort":"Resort2",
   "room":"1-Bedroom Villa",
   "price":"$5,460.00"
  },
  {
   "resort":"Resort2",
   "room":"2-Bedroom LO Villa",
   "price":"$7,040.00"
  },
  {
   "resort":"Resort2",
   "room":"2-Bedroom Villa",
   "price":"$7,040.00"
  },
  {
   "resort":"Resort2",
   "room":"3-Bedroom Villa",
   "price":"$15,620.00"
  }
]

但我希望它看起来更像这样......(如果格式看起来有点奇怪,那是因为我是这方面的菜鸟)

[
  {
    "resort":"Resort1"
    [
      {
       "room":"DStudio",
       "price":"$2,560.00"
      },
      {
       "room":"TVilla",
       "price":"$3,980.00"
      },
      {
       "room":"1-Bedroom Villa",
       "price":"$5,460.00"
      },
      {
       "room":"2-Bedroom LO Villa",
       "price":"$7,040.00"
      },
      {
       "room":"2-Bedroom Villa",
       "price":"$7,040.00"
      },
      {
       "room":"3-Bedroom Villa",
       "price":"$15,620.00"
      }
     ]
  }
  {
    "resort":"Resort2"
    [
      {
       "room":"DStudio",
       "price":"$2,560.00"
      },
      {
       "room":"TVilla",
       "price":"$3,980.00"
      },
      {
       "room":"1-Bedroom Villa",
       "price":"$5,460.00"
      },
      {
       "room":"2-Bedroom LO Villa",
       "price":"$7,040.00"
      },
      {
       "room":"2-Bedroom Villa",
       "price":"$7,040.00"
      },
      {
       "room":"3-Bedroom Villa",
       "price":"$15,620.00"
      }
     ]
  }
]

【问题讨论】:

标签: php mysql arrays json pdo


【解决方案1】:

现在知道您创建了您提供的数组,我更正了您的原始代码,以便创建您想要的所需格式:

$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);



$return = [];
foreach ($result as $row) {
    $points = $row['points'];
    $price = $points*20;
    $pricefrmt = "$".number_format ($price, 2);
    # You dont need this code anymore:
    #    $return[] = [ 
    #    'resort' => $row['resortname'],
    #    'room' => $row['roomname'],
    #    'price' => $pricefrmt
    #];
    # Just this one line below is all you need
    $return[$row['resortname']][] = ['room' => $row['roomname'], 'price' => $pricefrmt];
}

我不确定您是否可以在 3 维数组中输出 DB 表,但您确实可以像这样编辑当前输出:

# Declare new array
$newarr = [];

# Iterate through each of the second dimensional arrays as $arr
foreach($return as $arr){

    # Parse said data into the new array
    $newarr[$arr['resort']][] = array("room" => $arr['room'], "price" => $arr['price']);
}

JSON 输出/结果:

{
    "Resort1": [
        {
            "room": "DStudio",
            "price": "$2,560.00"
        },
        {
            "room": "TVilla",
            "price": "$3,980.00"
        },
        {
            "room": "1-Bedroom Villa",
            "price": "$5,460.00"
        },
        {
            "room": "2-Bedroom LO Villa",
            "price": "$7,040.00"
        },
        {
            "room": "2-Bedroom Villa",
            "price": "$7,040.00"
        },
        {
            "room": "3-Bedroom Villa",
            "price": "$15,620.00"
        }
    ],
    "Resort2": [
        {
            "room": "DStudio",
            "price": "$2,560.00"
        },
        {
            "room": "TVilla",
            "price": "$3,980.00"
        },
        {
            "room": "1-Bedroom Villa",
            "price": "$5,460.00"
        },
        {
            "room": "2-Bedroom LO Villa",
            "price": "$7,040.00"
        },
        {
            "room": "2-Bedroom Villa",
            "price": "$7,040.00"
        },
        {
            "room": "3-Bedroom Villa",
            "price": "$15,620.00"
        }
    ]
}

现场演示:http://sandbox.onlinephpfunctions.com/code/98541684aea923463de76183c1e42898c1d47ca5

【讨论】:

  • @BunsenHoneydew 更新了代码,我没有意识到你创建了你提供的数组,因为在那种情况下你可能只是在你创建 $return 的地方做
  • 没问题,但让我看看我是否可以修复您创建 $return 的代码,这样您就不会无缘无故地拥有这个额外的代码
  • @BunsenHoneydew 现在检查答案,你不需要我提供的原始代码,你可以通过摆脱原来的$return 代码并使用我在上面提供的代码来完成更新答案
  • 非常感谢!这样可行。我只需要改变我的印刷品,效果很好。 print_r(json_encode($return, JSON_PRETTY_PRINT));
  • 编辑:我修好了。我的 GROUP BY 把它扔掉了。
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 2020-10-13
  • 2013-06-03
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多