代码之家  ›  专栏  ›  技术社区  ›  Gerdi77

如何在多维关联数组中编辑键/值对?

  •  0
  • Gerdi77  · 技术社区  · 7 年前

    我希望我的标题有意义,我不太确定如何用一种简单的方式来描述我的问题,所以这里有一个很长的版本:

    我在PHP中工作,我有两个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",
        ...)
        )
    

    对我来说,仅仅通过一个查询似乎不可能实现这一点。 我尝试分别查询这两个表,重新排列 key=>value 在T2中使用 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];
    }
    

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

    2 回复  |  直到 7 年前
        1
  •  0
  •   Alex    7 年前

    如果项目参数的数量可变,则此表结构非常好。

    最简单的方法如下:

    $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
  •  0
  •   ReallyMadeMeThink    7 年前

    考虑使用 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 首先使用“,”分隔符,然后使用“:”

    推荐文章