Php 以不同的编码样式构建数组时出现问题
我在构建阵列时遇到了一个奇怪的问题。我从一个如下所示的数组开始:Php 以不同的编码样式构建数组时出现问题,php,arrays,loops,operators,Php,Arrays,Loops,Operators,我在构建阵列时遇到了一个奇怪的问题。我从一个如下所示的数组开始: Array ( [0] => Array ( [tag_id] => 19 [tag_translation_id] => 12 [fk_language_id] => 1 [fk_tag_id] => 19
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
)
)
$tags = array();
foreach ($results as $result)
$tags[$result['tag_id']][] = array($result['fk_language_id'], $result['tag_name']);
我要做的是将具有相同标记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
)
)
)
在后两个示例中,我做错了什么?操作符是字符串连接。数组与
+=
合并
如果我正确理解了这个问题,代码应该是这样的:
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
)
)
$tags = array();
foreach ($results as $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']);
}
.=是连接一个字符串
+=表示包含一个数字
[]是与数组关联的
希望这有帮助
编辑:注意,如果数组中不存在标记id,则它“可能”失败,因此可能值得先检查并将其设置为数组以防万一。要回答您的问题,您的第二个方法失败,因为您使用了不正确的
=
运算符。您的第三个方法失败,因为您的!在_array
中,check总是false
(它检查值是否在数组中,而不是键是否已设置),并在每次迭代时覆盖数组。您只需要这样做(正如其他人提到的,在伪代码中):
as_数组似乎是$results中任何内容的一种特殊方法。你不知道$results是否是可编辑的。是的,它是一个对象上的操作。这与上一个示例大致相同,并且不起作用。这也会删除最后一个结果。记住,我需要连接多个结果。+=给了我不支持的操作数类型。您不需要连接。连接是连接两个字符串,而不是合并数组<如果您实际使用了错误的操作数,代码>+=将为您提供不受支持的操作数类型,例如,您做错了什么。检查我编辑的答案-它给出了您需要的准确结果。如果
tag\u id
不存在,它不会失败,您不需要显式创建新数组。