具有数组搜索的多维数组循环

时间:2016-04-11 13:59:47

标签: php mysql arrays multidimensional-array

我意识到有关于多维数组和foreach循环的一些问题,我花了几个小时阅读它们并尝试让自己的循环工作 - 没有成功。如果解决方案是重复的,我会删除我的问题(如果首选,则链接到另一个)。

现在,挑战:

  • 使用返回的MYSQL结果数组。结果来自关联数组中的多个连接表。现在我需要将它转换为我需要的多维数组。
  • 我已经完成了大部分工作,但我的问题是循环并在数组中的正确位置添加新项目。

这里有一些代码:

//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。正如我上面提到的,我知道之前已经问过这个问题 - 虽然我无法让他们的解决方案为我工作。如果解决方案是重复的,我会删除此问题(例如,它对其他人没有帮助)。感谢您的帮助,非常感谢!

1 个答案:

答案 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);