我意识到有关于多维数组和foreach循环的一些问题,我花了几个小时阅读它们并尝试让自己的循环工作 - 没有成功。如果解决方案是重复的,我会删除我的问题(如果首选,则链接到另一个)。
现在,挑战:
这里有一些代码:
//example of how array is setup in the way I want, this part works.
foreach($results as $i => $a):
//some other code is here, see below.
$items[$i] = [
"id" => $a['id'],
"itemid" => $a['itemid'],
"name" => $a['name'],
"def" => $a['def'],
"class" => $a['class'],
"timeline" => $a['timeline'],
"files" => [
[0] => [
"id" => $a['fileid'],
"name" => $a['filename'],
"path" => $a['filepath'],
"type" => $a['filetype']
]
],
"tags" => [
[0] => [
"id" => $a['tagid'],
"name" => $a['tagname']
]
]
];
endforeach;
然后,我尝试了多种循环方式,以便只添加“标记”。或者'文件'如果该项目的内容是'与最后一个相同。这是我的编辑器中的当前代码,不起作用:
//inside foreach loop, before above code
if($items[$i-1]['id'] == $a['id']):
//it is the same item, works to here.
if(in_array($a['filename'], $items[$i-1], FALSE)):
//add to files array for last item
$items[$i-1]['files'][] = [
"id" => $a['fileid'],
"name" => $a['filename'],
"path" => $a['filepath'],
"type" => $a['filetype']
];
elseif(in_array($a['tagname'], $items[$i-1], FALSE)):
//add to tags array for last item
$items[$i-1]['tags'][] = [
"id" => $a['tagid'],
"name" => $a['tagname']
];
endif;
else:// else it does the code above
正如您所看到的,我最近的尝试是使用in_array,我现在意识到它并不适用于多维数组。我的问题是,我无法弄清楚如何确定它是同一项目的新文件还是新标签。
最终,我想要一系列'项目'它有多个文件'和'标签。'我之后会去json_encode并使用JS。
任何有关如何使其发挥作用或进行优化的建议都将不胜感激。
P.S。正如我上面提到的,我知道之前已经问过这个问题 - 虽然我无法让他们的解决方案为我工作。如果解决方案是重复的,我会删除此问题(例如,它对其他人没有帮助)。感谢您的帮助,非常感谢!
答案 0 :(得分:0)
不要使用"自动增量"数组索引因为它们容易搞砸了。使用您的数据库ID,因为它已经存在:
//example of how array is setup in the way I want, this part works.
foreach($results as $i => $a):
$items[$a['id']] = [ // THIS CHANGED.
"id" => $a['id'],
"itemid" => $a['itemid'],
...
现在,如果有任何进一步的结果,您可以轻松检查ID是否已存在于您的数组中:
if (isset($items[$a['id']])) {
// We had this id before, just add files/tags to it.
// Check first, if files subarray exists, if not: create it.
if (!isset($items[$a['id']]['files'])) {
$items[$a['id']]['files'] = array();
}
$items[$a['id']]['files'][] = array(...); // add the new file.
// Repeat for tags.
}
如果你的结果可以为id多次返回同一个文件,你可以使用搜索功能检查文件名是否已经在那里:
$filename = $a['filename'];
if (!searchFilename($filename, $items[$a['id']]['files']) {
// Filename is not in there, yet.
// Add file info.
}
function searchFilename($id, $array) {
foreach ($array as $key => $val) {
if ($val['filename'] === $id) {
return true;
}
}
return false;
}
同样适用于标签。
最后,如果你不想要$items
索引的id,只需调用:
$items = array_values($items);