如何识别具有相同值的数组并在PHP中放入一个大数组


How to Identify array with same value and put in a big array in PHP

我这里有数据:

 Array
 (
 [3] => Array
    (
        [SiteID] => 3
        [Balance] => 19000.00
        [MinBalance] => 100000.00
        [MaxBalance] => 1000000.00
        [OwnerAID] => 17
        [GroupID] => 1
        [Deposit] => 1500
        [Redemption] => 1000
        [Reload] => 1000
    )
  [3] => Array
    (
        [SiteID] => 3
        [Balance] => 19000.00
        [MinBalance] => 100000.00
        [MaxBalance] => 1000000.00
        [OwnerAID] => 211
        [GroupID] => 1
        [Deposit] => 1500
        [Redemption] => 1000
        [Reload] => 1000
    )

   [4] => Array
    (
        [SiteID] => 4
        [Balance] => 19000.00
        [MinBalance] => 100000.00
        [MaxBalance] => 1000000.00
        [OwnerAID] => 17
        [GroupID] => 1
        [Deposit] => 1500
        [Redemption] => 1000
        [Reload] => 1000
    )
    [4] => Array
    (
        [SiteID] => 4
        [Balance] => 19000.00
        [MinBalance] => 100000.00
        [MaxBalance] => 1000000.00
        [OwnerAID] => 12
        [GroupID] => 1
        [Deposit] => 1500
        [Redemption] => 1000
        [Reload] => 1000
    )
        [5] => Array
        (
            [SiteID] => 2
            [Balance] => 19000.00
            [MinBalance] => 100000.00
            [MaxBalance] => 1000000.00
            [OwnerAID] => 11
            [GroupID] => 1
            [Deposit] => 1500
            [Redemption] => 1000
            [Reload] => 1000
        )
      )
   )

然后我需要制作一个名为"CorpAID"的新密钥,指向拥有相同SiteID的OwnerAID列表,这意味着SiteID可以由一个或多个OwnerAID拥有。结果应如下所示:

Array 
(
 [0]=> Array
 (
    [SiteID] => 3
    [Balance] => 19000.00
    [MinBalance] => 100000.00
    [MaxBalance] => 1000000.00
    [OwnerAID] => 17
    [GroupID] => 1
    [Deposit] => 1500
    [Redemption] => 1000
    [Reload] => 1000
    [CorpAID] => Array
                (
                   [0] => 17
                   [1] => 211
                )
             )
   [1]=> Array
(
    [SiteID] => 3
    [Balance] => 19000.00
    [MinBalance] => 100000.00
    [MaxBalance] => 1000000.00
    [OwnerAID] => 17
    [GroupID] => 1
    [Deposit] => 1500
    [Redemption] => 1000
    [Reload] => 1000
    [CorpAID] => Array
                (
                   [0] => 12
                   [1] => 17
                )
             )          

有可能做到吗?请帮助我,并以正确的方式引导我。提前谢谢你。

这是未经测试的代码,但阅读正在发生的事情应该有点直观。我假设SiteID是要分组的字段。

$tmp =&$out[$record['SiteID']];只是避免一遍又一遍地键入$out[$record['SiteID']]的快捷方式。

$out = array();
foreach ($records as $record) {
    $tmp = &$out[$record['SiteID']];
    if (isset($tmp)) {
        $tmp['CorpAID'][] = $record['OwnerAID'];
    } else {
        $tmp = $record;
        $tmp['CorpAID'] = array($record['OwnerAID']);
    }
}

顺便说一句,在MySQL中,你也可以这样做以使PHP中的工作更容易:

SELECT GROUP_CONCAT(OwnerAID) AS CorpAID
FROM ...
GROUP BY SiteID;

我建议你创建一个小函数来比较多维数组的键和值:

function findInArray($key, $value, $array){
    foreach($array as $key=>$row){
      if(array_key_exists($key, $row){
           if($row[$key] == $value)
                    return $key;
         }
   }
   return -1;
}

然后执行数组foreach以在正确的位置设置值,我们搜索结果数组中是否已存在SiteID,如果没有,我们将其添加到集合中,否则我们只查看OwnerAID是否已经在CorpAID数组中或我们添加它。这样我们避免了重复输入(似乎您不希望在示例中发布):

$result_array = array();
foreach($array as $row){
 $key = findInArray('SiteID', $row['SiteID'], $result_array);
  if($key == -1){
           $temp = $row;
           $temp['CorpAID'] = array($row['OwnerAID']);
           $result_array[] = $temp;
          }
  else {
     if(findInArray('CorpAID', $row['OwnerAID'], $result_array) == -1){
            $result_array[$key]['CorpAID'][] = $row['OwnerAID'];
        }
  }
}

要实现所需的内容,您需要遍历值并为每个条目分配一个新的CorpAID字段。然后,该CorpAID字段需要通过SiteID引用该值,该值将基于每个OwnerAID的迭代而构建。

引用很重要,因为当您将其分配给第一个元素时,这些元素尚未完全填充,因为在编写时,每个SiteID可能有多个OwnerAID

这个声音越复杂,代码就越小。由于这使用了参考,因此我取消设置它们以稍后清理:

$table = array();
foreach($data as &$item)
{    
    $item['CorpAID'] = &$table[$item['SiteID']];
    $item['CorpAID'][] = $item['OwnerAID'];
}
unset($item);
unset($table);

但是,通过将站点信息(数据中经常重复)与所有者信息分开,您可以受益更多。它可以像上面一样工作。