【问题标题】:Add SQL PHP array to an already existing array将 SQL PHP 数组添加到已经存在的数组中
【发布时间】:2013-02-22 02:43:46
【问题描述】:

我有两个数据库表。一个包含市场,另一个包含市场的位置。 Marketplaces 可以有多个位置,这两个表通过 MarketplaceID 连接。我需要查询市场将其变成一个数组,并在 foreach 或 while 期间,将位置作为数组添加到市场。这都是两个 json 响应的一部分。然而,我的目标是将数据组合在一起并有一个 json 响应,其中位置在市场 json 数据中作为“位置”。最终是一个数组,其中 Marketplaces 是父级, Locations 是子级。

代码1(Table1查询):

$sql = "SELECT * FROM Marketplaces WHERE Status = 1";
$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result)){   
  foreach($row as $key => $value){
      $arr[$key] = $value;
  }
  $main_arr[] = $arr;
}
return $main_arr;

结果:

[{"MarketplaceID":"1","AccountID":"0","BusinessName":"Mike's Pub","BusinessType":"1","Status":"1","CreationDate":"0000-00-00 00:00:00"}]

代码2(Table2查询):

$sql = "SELECT * FROM Locations WHERE MarketplaceID = 1";
$results = mysql_query($sql);

while($row = mysql_fetch_assoc($results)){
  foreach($row as $key => $value){
    $arr[$key]=$value;
  }
  $main_arr[] = $arr;
}

结果:

[{"LocationID":"1","MarketplaceID":"1","Address1":"5055 Business Center Drive","Address2":"Suite 100","City":"San Francisco","CA":"1","Zip":"90210","Phone1":"(555) 555-555","Phone2":"(555) 555-5555","EmailAddress":"email@msn.com","StoreNumber":"200"},{"LocationID":"2","MarketplaceID":"1","Address1":"112 Street Court","Address2":"","City":"Los Angeles","StateID":"2","Zip":"90210","Phone1":"(555) 555-6666","Phone2":"","EmailAddress":"email@gmail.com","StoreNumber":"300"}]

【问题讨论】:

  • 您希望合并后的结果是什么样的?
  • 首先,您需要考虑为什么要这样做:$row = mysql_fetch_assoc(..) 然后 foreach $row 以不同的名称创建完全相同的数组@ 987654327@
  • 为什么要在代码 1 中创建数组? ID = 1 的商城只能有一个。
  • @Barmar 它们是两个不同的查询。我希望我的结果包含一个数组中的所有位置,而不是当前被两种不同逻辑分割的两个单独的数组,我也想合并.
  • 您能否在问题中发布您希望结果的外观。

标签: php sql json foreach while-loop


【解决方案1】:

首先,放下这个

  foreach($row as $key => $value){
      $arr[$key] = $value;
  }

除了和$arr = $row 一样,它什么都不做;实际上它做了其他事情 - 产生警告,因为 $arr 未定义。

编辑 更新答案,因为初始查询已从 WHERE MarketplaceID=1 更改为 WHERE Status = 1"

$main_arr=array();
$sql = "SELECT * FROM Marketplaces WHERE Status = 1";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){   
  $row['locations']=array();
  $sql2 = "SELECT * FROM Locations WHERE MarketplaceID = ".$row['MarketplaceID'];
  $results2 = mysql_query($sql2);
  while($row2 = mysql_fetch_assoc($results2)){
      $row['locations'][]=$row2;
  }
  $main_arr[] = $row; 
}

// print_r($main_arr); and view page source to read, rather than a JSON string

实际上,我会稍微不同地这样做,这样我的数组就不会混淆 Marketplace 内的位置,但仍将它们保持在一起,如下所示

while($row = mysql_fetch_assoc($result)){   
  $thisrow=array('marketplace'=>$row, 'locations'=>array());
  $sql2 = "SELECT * FROM Locations WHERE MarketplaceID = ".$row['MarketplaceID'];
  $results2 = mysql_query($sql2);
  while($row2 = mysql_fetch_assoc($results2)){
      $thisrow['locations'][]=$row2;
  }
  $main_arr[] = $thisrow; 
}

所以对象将是

{ 
    "marketplace": {"MarketplaceID": 1, "BusinessName": "Fred Bloggs", ... }
    "locations": [
        {"LocationId": 1, "Address1": "Some address"},
        {"LocationId": 2, "Address1": "Some address"}
    ]
}

【讨论】:

  • 我可以将 MarketplaceID 传递给第二个查询吗?我试过了,但没有成功: $sql = "SELECT * FROM Locations WHERE MarketplaceID = '".$marketplace['MarketplaceID']."'";
  • 我为造成的混乱道歉,并试图简化以使其更容易,但这只是使它变得更容易 =P。我现在更了解您是如何看待一切的,并且您在没有我解释的情况下看到了大局。第一个查询更新为此(超过 1 个位置): $sql = "SELECT * FROM Marketplaces WHERE Status = 1";第二个 $sql = "SELECT * FROM Locations WHERE MarketplaceID = '".$marketplace['MarketplaceID']."'";如何添加 for each 以使其正常工作?
  • 谢谢,正是我需要的!
  • 好的。我刚刚添加了一个关于我将如何实际执行此操作的附录。
  • 保持您熟悉的相同逻辑。如果我将作为孩子的程序添加到位置和作为孩子的奖励到程序。我将如何处理?这是我没有嵌套在 HTML 部分的代码:jsfiddle.net/rHgS3@phpnoodles
【解决方案2】:

如果我没看错的话,您的第一个数组是一个包含 Marketplace 1 数据的单维数组,而您的第二个数组是一个多维数组,其中父数组中的每个元素都包含一个子数组,其中包含有关单一位置。如果您想将第二个数组放在第一个数组中,请尝试像这样嵌套循环:

$sql = "SELECT * FROM Marketplaces WHERE MarketplaceID = 1";
$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result)){   

  foreach($row as $key => $value){
  $arr[$key] = $value;

}

$sql2 = "SELECT * FROM Locations WHERE MarketplaceID = 1";
$results2 = mysql_query($sql2);

while($row2 = mysql_fetch_assoc($results2)){

  foreach($row2 as $key => $value){
  $arr2[$key]=$value;

}

$arr['locations'] = $arr2;

$main_arr = $arr;

}

这将创建一个临时数组 $arr2,其中包含您的位置数据,然后将其存储在 $arr['locations'] 中。在代码末尾,您要添加到 $main_arr 的 $arr 应具有以下元素:“MarketplaceID”、“AccountID”、“BusinessName”、“BusinessType”、“Status”、“CreationDate”、“location ",并且 "location" 应该是一个包含元素的数组,这些元素是包含从数据库中提取的位置信息的数组。

希望这能回答你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2020-12-08
    • 2020-12-08
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多