PHP数组数据操作


PHP Array Data Manipulation

我有一个存储在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;
    }
}