我在构建数组时遇到了一个奇怪的问题。我从一个看起来像这样的数组开始:
Array (
[0] => Array (
[tag_id] => 19
[tag_translation_id] => 12
[fk_language_id] => 1
[fk_tag_id] => 19
[tag_name] => test
)
[1] => Array (
[tag_id] => 20
[tag_translation_id] => 14
[fk_language_id] => 1
[fk_tag_id] => 20
[tag_name] => testa
)
[2] => Array (
[tag_id] => 20
[tag_translation_id] => 15
[fk_language_id] => 3
[fk_tag_id] => 20
[tag_name] => fdfda
)
)
我想做的是将每个具有相同tag_id的结果合并到一个数组中。这项工作:
$tags = array();
foreach($results->as_array() as $key=>$result)
{
if(!in_array($result['tag_id'], $tags))
{
$tags[$result['tag_id']] = array();
}
}
foreach($results->as_array() as $result)
{
array_push($tags[$result['tag_id']], array($result['fk_language_id'] , $result['tag_name']));
}
以下是预期结果:
Array (
[19] => Array (
[0] => Array (
[0] => 1
[1] => test
)
)
[20] => Array (
[0] => Array (
[0] => 1
[1] => testa
)
[1] => Array (
[0] => 3
[1] => fdfda
)
)
)
然而,我有两个循环,我知道这并不理想。为什么这些不起作用??
$tags = array();
foreach($results->as_array() as $key=>$result)
{
$tags[$result['tag_id']] .= array($result['fk_language_id'] , $result['tag_name']);
}
在这个例子中,我得到了两个空数组。。。
Array ( [19] => Array [20] => ArrayArray )
甚至。。。
$tags = array();
foreach($results->as_array() as $key=>$result)
{
if(!in_array($result['tag_id'], $tags))
{
$tags[$result['tag_id']] = array();
}
array_push($tags[$result['tag_id']], array($result['fk_language_id'] , $result['tag_name']));
}
由于某种原因,它用第二数组的第二值覆盖第二数组中的第一值。
Array (
[19] => Array (
[0] => Array (
[0] => 1
[1] => test
)
)
[20] => Array (
[0] => Array (
[0] => 3
[1] => fdfda
)
)
)
第二个例子中我做错了什么?
要回答您的问题,您的第二个方法会失败,因为您使用了不正确的.=
运算符。第三个方法失败,因为!in_array
检查始终是false
(它检查值是否在数组中,而不是是否设置了键),并在每次迭代时覆盖数组。你只需要这个(正如其他人提到的,在伪代码中):
$result = array();
foreach ($array as $values) {
$result[$values['key']][] = array($values['foo'], $values['bar']);
}
.=
运算符是字符串串联。数组与+=
合并。
如果我正确理解这个问题,代码应该是这样的:
$tags = array();
foreach ($results as $result)
$tags[$result['tag_id']][] = array($result['fk_language_id'], $result['tag_name']);
$tags = array();
foreach($results->as_array() as $key=>$result)
{
$tags[$result['tag_id']] .= array($result['fk_language_id'] , $result['tag_name']);
}
不能使用向数组添加值。=(点相等)运算符。
你为什么要做$results->as_array()????
简单地做:
foreach($results as $key=>$result) {
而不是使用。=尝试使用[]
$tags = array();
foreach ($results as $result)
{
if(!isset($tags[$result['tag_id']]))
$tags[$result['tag_id']] = array();
$tags[$result['tag_id']][] = array($result['fk_language_id'], result['tag_name']);
}
.=就是把一根绳子凹进去+=是将一个数字凹入[]是凹入阵列
希望这有帮助?
编辑:注意到,如果数组中不存在tag_id,它"可能"会失败,因此可能值得先检查一下,并将其设置为数组以备不时之需。