构建数组时遇到了一个奇怪的问题。我从一个看起来像这样的数组开始:
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
)
)
)
在后两个例子中我做错了什么?
答案 0 :(得分:1)
.=
运算符是字符串连接。数组与+=
合并。
如果我正确理解了这个问题,代码应该是这样的:
$tags = array();
foreach ($results as $result)
$tags[$result['tag_id']][] = array($result['fk_language_id'], $result['tag_name']);
答案 1 :(得分:1)
要回答您的问题,您的第二种方法会失败,因为您使用了错误的.=
运算符。您的第三种方法失败,因为!in_array
检查始终为false
(它会检查值是否在数组中,而不是键是否已设置)并在每次迭代时覆盖数组。你真的需要这个(正如其他人所说,伪代码):
$result = array();
foreach ($array as $values) {
$result[$values['key']][] = array($values['foo'], $values['bar']);
}
答案 2 :(得分:0)
$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) {
答案 3 :(得分:0)
而不是使用。=尝试使用[]
$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,它“可能”会失败,因此可能值得先检查并将其设置为数组以防万一。