【问题标题】:How to edit key/value pairs in multidimensional, associative arrays?如何在多维关联数组中编辑键/值对?
【发布时间】:2018-08-31 18:17:46
【问题描述】:

我希望我的标题有意义,我不太清楚如何描述我的问题,所以这里是长版本:

我正在使用 PHP,我有 2 个 MySQL 表显示项目及其规格(我无法更改表结构)。

T1(物品)

+---------+--------+
| itemID  |  item  |
+---------+--------+
|       1 | TV     |
|       2 | Radio  |
|       3 | Camera |
|     ... | ...    | 
+---------+--------+

T2(规格)

+---------+--------+------+
| itemID  | specID | spec |
+---------+--------+------+
|       1 | color  | red  |
|       1 | weight | 10   |
|       1 | price  | 499  |
|       2 | color  | blue |
|     ... | ...    | ...  |
+---------+--------+------+

我想要一个像这样的多维关联数组

array(
[0]=> array(
    "itemID"=>"1",
    "item"=>"TV", 
    "color"=>"red",
    "weight"=>"10", 
    "price"=>"499") 
[1]=> array(
    "itemID"=>"2", 
    "item"=>"Radio", 
    "color"=>"blue",
    ...)
    )

在我看来,只用一个查询就不可能做到这一点。 我尝试分别查询这两个表,重新排列T2中的key=>value并使用array_merge

我目前拥有的是来自 T1 的数组

array(
    [0]=> array( 
        "itemID"=> "1",
        "item"=>"TV")
    [1]=> array(
        "itemID"=> "2",
        "item"=>"Radio")
    [2]=> array(
        "itemID"=> "3",
        "item"=>"Camera")
    ...)

从 T2 开始,数组以相同的形式出现

array(
    [0]=> array( 
        "itemID"=> "1",
        "specID"=> "color",
        "spec"=>"red")
    [1]=> array(
        "itemID"=> "1",
        "specID"=> "weight",
        "spec"=>"10")
    [2]=> array(
        "itemID"=> "1",
        "specID"=> "price",
        "spec"=>"499")
    ...)

更改数组后,我将得到一个数字数组,而不是我想要的两个关联数组

array(
    [0]=> array(
        [0] => ["itemID" => "1","color" => "red","weight" => "10", "price" => "499"])
    [1]=> array(
        [0] => ["itemID" => "2","color" => "blue",...])
    ...)

我的代码是

$newArray = array();
for ($i = 0; $i<=n; $i++) {
    foreach($oldArray[$i] as $key => $value) {
        if ($key === 'itemID') {
            $a = $key . '" => "' . $value . '",';
            }
        elseif($key === 'specID') {
            $b = '"' . $key . '" => "';
            }
        elseif($key === 'spec') {
            $c = $value;
            }
    }
    $newArray[] = [$a.$b.$c];
}

也许我在这里完全错了,所以任何帮助将不胜感激 - 谢谢!

【问题讨论】:

  • 似乎您需要的是 SQL 中的 JOIN。尝试根据 itemID 加入您的两个表。 w3schools.com/sql/sql_join.asp
  • JOIN 只有在每个项目的规格数量不变的情况下才有效。如果它变化,或者如果specID可以变化,那就不方便了。

标签: php mysql multidimensional-array associative-array key-value


【解决方案1】:

如果item参数的数量是可变的,这个表结构很好。

最简单的方法如下:

$array1 = array(...); // from table 1
$array2 = array(...); // from table 2
$result = array();
foreach ($array1 AS $v) {
    $result[ $v['itemID'] ] = $v;
}
foreach ($array2 AS $v) {
    $result[ $v['itemID'] ][ $v['specId'] ] = $v['spec'];
}

【讨论】:

    【解决方案2】:

    考虑使用group_concat

    这将在 1 个查询中获取您需要的所有内容:

    select items.itemID,
    group_concat(concat(specs.specID,":",specs.spec)) as properties
    from items join specs on items.itemID=specs.itemID
    group by items.itemID;
    

    结果将如下所示:

    +--------+-------------------------------+
    | itemID | properties                    |
    +--------+-------------------------------+
    |      1 | color:red,weight:10,price:499 |
    |      2 | color:blue                    |
    +--------+-------------------------------+
    

    我将留给您填充数组,但它应该是微不足道的,首先使用 explode 使用“,”分隔符,然后使用“:”

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 2021-02-06
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      相关资源
      最近更新 更多