我有一个存储在DB中的项目列表,在请求它们之后,它们位于数组($data
)中。现在数组中大约有200个元素,每个元素本身都是一个键值数组。数据数组中的每个元素都有一个名为[Acr]
的键和一个分配给它的名称。
现在的问题是在这个数组中
Array
(
[0] => Array
(
[ID] => 2
[Name] => Name Here
[Acr] => ARR
[Valid] => 1
[Orig] => 1
)
[1] => Array
(
[ID] => 2
[Name] => Name Here
[Acr] => ABC
[Valid] => 1
[Orig] => 1
)
[2] => Array
(
[ID] => 2
[Name] => Name Here
[Acr] => XYZ
[Valid] => 1
[Orig] => 1
)
...
存在具有相同Acr的项,但它们是具有该Acr的第一个项的子元素。例如,$data
中还有10个项目的Acr为ARR
,我想将这些子元素添加到原始(即第一个)数组项目中,该数组项目的Acr值位于键sub
下。在迭代之后,它生成了。
Array
(
[0] => Array
(
[ID] => 2
[Name] => Name Here
[Acr] => ABC
[Valid] => 1
[Orig] => 1
)
.....
[14] => Array
(
[ID] => 2
[Name] => Name Here
[Acr] => ARR
[Valid] => 1
[Orig] => 1
[Sub] =>
[0] => Array
(
[ID] => 23
[Name] => Sub Name Here
[Acr] => ARR
[Valid] => 1
[Orig] => 0
)
[1] => Array
(
[ID] => 24
[Name] => Sub Name Here
[Acr] => ARR
[Valid] => 0
[Orig] => 1
)
)
...
现在我不知道该怎么做。此外,它都是排序的,所以当你看到第一个ARR
所有的子ARR
都在它们下面,只有大约5个原始类别有子元素,所以如果有一种方法可以做到这一点,知道哪些是追加的,那就太好了。
我不确定我是否正确地解释了这个问题,所以如果你有任何问题,请直接问我,我会在几分钟内回复。
谢谢
对于这种情况,在操纵数组中接受字母数字键:
$new = array();
foreach ($array as $entry) {
if (!array_key_exists($entry['Acr'], $new)) {
$entry['Sub'] = array();
$new[$entry['Acr']] = $entry;
} else $new[$entry['Acr']]['Sub'][] = $entry;
}
尝试一个可以做到这一点的小函数,测试它并让我知道它是否有效
$newRecord = array();
foreach($records as $record){
# if the Acr already exists in a primary record,
# insert this record as a Sub-record.
if(array_key_exists($record['Acr'], $newRecord)){
$newRecord[$record['Acr']]['Sub'][] = $record;
# else insert it as a primary record
} else {
$newRecord[$record['Acr']] = $record;
}
}