堆叠数组元素

时间:2015-10-25 20:48:36

标签: php mysql arrays

晚间!

我真的对此毫无头绪,想到自己,我会求助于所有人,以获得一些指导。我有一个直接从MySQL表中获取的数组,如下所示:

array(106) {
  [...]
  [32]=>
  array(4) {
    ["x"]=>
    int(3)
    ["y"]=>
    int(5)
    ["z"]=>
    int(7)
    ["image"]=>
    string(14) "ground/grass/1"
  }
  [33]=>
  array(4) {
    ["x"]=>
    int(3)
    ["y"]=>
    int(5)
    ["z"]=>
    int(8)
    ["image"]=>
    string(16) "objects/nature/1"
  }
  [34]=>
  array(4) {
    ["x"]=>
    int(4)
    ["y"]=>
    int(5)
    ["z"]=>
    int(7)
    ["image"]=>
    string(14) "ground/grass/1"
  }
  [...]
}

我想要做的是合并xy键相等的元素图像,创建一个新的数组,其中z值成为键。可以有两个以上具有相同xy值的元素,但z值对于这些元素永远不会相同。有点难以解释,但所需的输出看起来像这样:

array(106) {
  [...]
  [32]=>
  array(4) {
    ["x"]=>
    int(3)
    ["y"]=>
    int(5)
    ["z"]=>
    int(7)
    ["image"]=>
      array(2) {
        [7]=>
        string(14) "ground/grass/1"
        [8]=>
        string(16) "objects/nature/1"
      }
  }
  [34]=>
  array(4) {
    ["x"]=>
    int(4)
    ["y"]=>
    int(5)
    ["z"]=>
    int(7)
    ["image"]=>
    string(14) "ground/grass/1"
  }
  [...]
}

到目前为止,我很乐意向你提供我的进展,但事实是我对这一点毫无头绪。 MySQL表如下所示:

| id |  x |  y |  z |              image |
+----+----+----+----+--------------------+
|  1 |  3 |  5 |  7 |   'ground/grass/1' |
|  2 |  3 |  5 |  8 | 'objects/nature/1' |

很抱歉这个问题很长。提前谢谢!

3 个答案:

答案 0 :(得分:1)

您是否考虑在SQL查询中使用GROUP_CONCAT?像

这样的东西
SELECT x, y, GROUP_CONCAT(CONCAT(z,':',image)) as image
FROM your_table
GROUP BY x, y

函数here的文档。

答案 1 :(得分:1)

以下是我为达到预期效果所做的工作:

我使用了来自wogsland’s的查询:

SELECT x, y, GROUP_CONCAT(CONCAT(z,':',image)) as image
FROM your_table
GROUP BY x, y

然后我循环查询结果(其中$map包含结果):

foreach ($map as $i => $tile) {
    $map[$i]['image'] = explode(',', $tile['image']);
    $images = $map[$i]['image'];
    $map[$i]['image'] = [];
    foreach ($images as $image) {
        $image = explode(':', $image);
        $map[$i]['image'][$image[0]] = $image[1]; 
    }
}

答案 2 :(得分:0)

这是一种在PHP中几乎完成你想做的事情的丑陋方式。数组在开头是$ arr,在$ out中是新数组:

<div id="flexWrapper">
    <ul id="flexContainer">
        <li class="flex-item">1</li>
        <li class="flex-item">2</li>
        <li class="flex-item">3</li>
        <li class="flex-item">4</li>
        <li class="flex-item">5</li>
    </ul>
</div>

输出将是:

$res = array();
$out = array();
foreach( $arr as $item ) {
    $res[$item['x']][$item['y']][$item['z']] = $item['image'];
}

foreach( $res as $k => $v ) {
    foreach( $v as $n => $m ) {
        $out[] = array( 'x' => $k, 'y' => $n, 'image' => $m );
    }
}

'z'值被删除,因为它没有真正的用途,'image'总是一个以'z'值为键的数组!

我会使用三维数组array(106) { [...] [32]=> array(4) { ["x"]=> int(3) ["y"]=> int(5) ["image"]=> array(2) { [7]=> string(14) "ground/grass/1" [8]=> string(16) "objects/nature/1" } } [34]=> array(4) { ["x"]=> int(4) ["y"]=> int(5) ["image"]=> array(1) { [7]=> string(14) "ground/grass/1" } } [...] } 并跳过最后一步......