【发布时间】:2016-06-10 15:50:45
【问题描述】:
我有一个来自 MySQL 的记录集,它返回给定对象的类别 ID 及其值。例如:
+-----------+-------------+----------------+
| object_id | category_id | category_value |
+-----------+-------------+----------------+
| 1 | 2 | VEGETARIAN |
| 1 | 3 | MATARÓ |
| 1 | 5 | MARCO POLO |
| 1 | 5 | JOHN DOE |
| 2 | 2 | VEGETARIAN |
| 2 | 3 | MATARÓ |
| 2 | 5 | JOHN DOE |
+-----------+-------------+----------------+
有了这个,我需要的是 PHP 中的以下结果关联数组:
// They are arrays, so more than one object_id can be in the same category tree (and the object_id can be repeated across categories)
$final_array['VEGETARIAN']['MATARÓ']['MARCO POLO'] = array(1);
$final_array['VEGETARIAN']['MATARÓ']['JOHN DOE'] = array(1, 2);
查询首先按object_id 对结果进行排序,然后再按category_id 和用户设置的顺序对结果进行排序。所以,它就像ORDER BY object_id ASC, FIELD(category_id, usercat1, usercat2, usercat3)(在这种情况下是FIELD(category_id, 2, 3, 5)。
我有每组都经过的循环,我试图保留一个临时变量来存储数组级别,因为它们可以更改(并不总是 3 级),所以类似于:
$temporary_array['VEGETARIAN'] = array();
$temporary_array = $temporary_array['VEGETARIAN'];
// And then, on the next iteration
$temporary_array['MATARÓ'] = array();
$temporary_array = $temporary_array['MATARÓ'];
// Now, $temporary_array would be equal to $temporary_array['VEGETARIAN']['MATARÓ'];
所以我可以根据 new 类别值创建一个主键,该值将存储为父数组的子级,并获取所有层次树。 每个级别都应包括所有下一个级别。
我尝试全局声明它并通过引用传递它,但它似乎不起作用。
有没有办法在 PHP 中实现这一点?你会怎样做才能得到想要的结果?
编辑:
我更接近于颠倒类别的顺序,所以我首先得到最后一个类别(其中没有其他类别的那个),然后我向上排列数组,如下所示:
// Long story very short, would be like
$final_array['new_category_value'] = $old_final_array;
并为每个对象继续上升。当我更改object_id 时,我会:
array_merge_recursive($final_array, $actual_object_array);
但是,我仍然无法获得想要的结果。
感谢您的宝贵时间和 cmets!
【问题讨论】:
-
您使用什么标准来确定一个类别应该是任何其他类别的父级还是子级?它只是升序 category_id 值 - 即 5>3 因此类别 5 应该是类别 3 的子类别,并且 id 为 5 的两个类别应该具有相同的父类别?
-
这是它们出现的顺序。如果类别 5 出现在 3 之前,则数组应为
$t['category5_value']['category3_value']。当然,如果类别 3 有多个值,则它们都必须是类别 5 的子项。但这只是因为顺序(每个查询都可以更改,因为用户决定它)。
标签: php arrays associative-array multi-level