Php 堆叠阵列元素

Php 堆叠阵列元素,php,mysql,arrays,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]=> ar

晚上好

我真的对此一无所知,我想我应该向你们寻求一些指导。我有一个数组,直接从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"
  }
  [...]
}
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"
  }
  [...]
}
| id |  x |  y |  z |              image |
+----+----+----+----+--------------------+
|  1 |  3 |  5 |  7 |   'ground/grass/1' |
|  2 |  3 |  5 |  8 | 'objects/nature/1' |
我想做的是合并元素的图像,其中
x
y
键相等,创建一个新数组,其中
z
值成为键。可以有两个以上的元素具有相同的
x
y
值,但这些元素的
z
值永远不相同。有点难以解释,但所需的输出如下所示:

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"
  }
  [...]
}
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"
  }
  [...]
}
| id |  x |  y |  z |              image |
+----+----+----+----+--------------------+
|  1 |  3 |  5 |  7 |   'ground/grass/1' |
|  2 |  3 |  5 |  8 | 'objects/nature/1' |
我很乐意向你们提供我目前的进展情况,但事实是我在这一点上一无所知。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"
  }
  [...]
}
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"
  }
  [...]
}
| id |  x |  y |  z |              image |
+----+----+----+----+--------------------+
|  1 |  3 |  5 |  7 |   'ground/grass/1' |
|  2 |  3 |  5 |  8 | 'objects/nature/1' |

很抱歉问了这么长的问题。提前谢谢

您是否考虑过在SQL查询中使用GROUP_CONCAT?差不多

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

函数的文档。

以下是我为实现预期结果所做的工作:

我使用了答案中的查询:

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


这是一种在PHP中几乎实现您想要的功能的丑陋方式。数组开头以$arr为单位,新数组以$out为单位:

$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 );
    }
}
输出将是:

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"
      }
  }
  [...]
}
“z”值被删除,因为它没有实际用途,“image”始终是一个以“z”值为键的数组


我会使用三维数组
$res['x']['y']['z']
并跳过最后一步…

是的,我正在查看它,但问题是,在执行此操作时,我丢失了一行/部分行的
z
值。我将对它进行更多的研究,看看我能完成什么。OIC-您可以通过在其中嵌套一个CONCAT来实现这一点(请参见上面的编辑)。