Я понимаю, что существует ряд вопросов о многомерных массивах и циклах 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. Как я уже упоминал выше, я знаю, что этот вопрос задавали раньше - хотя я не смог заставить свои решения работать для меня. Я удалю этот вопрос, если решение является дубликатом (как, впрочем, это не очень полезно для других). Спасибо за любую помощь, мы очень благодарны!
Что ваш PHP версии? На PHP> = 5.5 вы можете использовать ['array_column'] (http://php.net/manual/en/function.array-column.php):' in_array ($ a ['filename'], array_column ($ items [$ i-1] ['files'], 'name')) ' – fusion3k
Спасибо за подсказку @ fusion3k. Я прочитаю документы об этой функции и попробую. – turnfire