PHP比较单个数组中的值并输出差异


PHP compare values in a single array and output the difference

我有一个像这样的数组:

$rowarray(
[0] => [PID] => 97162 [TID] => 340 [StatsID] => 49678
[1] => [PID] => 97165 [TID] => 340 [StatsID] => 49673
[2] => [PID] => 97167 [TID] => 340 [StatsID] => 49675
[3] => [PID] => 97162 [TID] => 340 [StatsID] => 49679
)

然后我的代码看起来像这样:

$cntr=0;
foreach($rowarray as $row)
{
 echo "<tr><td>$row[PID] $row[TID] $row[StatsID] </td></tr>";
$cntr++;
}

我想做两件事:我希望能够不打印数组中的重复项,但打印具有不同值的附加列。所以我想要的输出是这样的:

97162 340 49678 49679

97165 340 49673

97167 340 49675

我从array_unique()开始,但它只返回:

假设仅StatsID更改(从问题中不清楚)

$map = array();
foreach($rowarray as $row){
    $k = $row["PID"] . '-' . $row["TID"];
    if( !isset( $map[$k] ) ){
        $map[$k] = array();
    }
    array_push( $map[$k], $row["StatsId"] );
}

foreach($map as $k=>$v){
    $row = explode( '-', $k );
    echo "<tr><td>$row[0] $row[1] " . implode( " ", $v ) . " </td></tr>";
}

我会这样做:

  • 首先对数组进行排序(使用usort按PID排序,然后按TID排序)
  • 初始化"最后"变量($last_PID$last_TID)。它们将各自的值存储在循环
  • 中。
  • 在循环中,首先比较"当前"变量和"最后"变量,如果它们相同,则回显StatsID值。
  • 如果它们不相同,则输出<tr>(但不是最终的</tr>,因此循环的第一部分可以在必要时添加更多的StatsID值)
  • 仍然在循环中,在输出所有内容后,更新"last"变量。
  • 循环结束后,输出最终的</tr>

这可能不是最优的,但我很确定它会工作。

$rowarray结构体转换为数组映射的映射,如下所示:

$rowarray = array(
    array('PID' => 97162, 'TID' => 340, 'StatsID' => 49678),
    array('PID' => 97165, 'TID' => 340, 'StatsID' => 49673),
    array('PID' => 97167, 'TID' => 340, 'StatsID' => 49675),
    array('PID' => 97162, 'TID' => 340, 'StatsID' => 49679)
);
$keys = array();
foreach ($rowarray as $row) {
    if (!is_array(@$keys[$row['TID']])) {
        $keys[$rowarray['TID']] = array();
    }
    if (!is_array(@$keys[$row['TID']][$row['PID']])) {
        $keys[$row['TID']][$row['PID']] = array();
    }
    $keys[$row['TID']][$row['PID']][] = $row['StatsID'];
}
foreach ($keys as $pid => $pid_arr) {
    foreach ($pid_arr as $tid => $tid_arr) {
        echo "<tr><td>$tid $pid " . implode(' ', $tid_arr) . "</td></tr>";
    }
}

查看下面的代码

据我所知,要做到这一点,唯一的方法是循环遍历数组,创建一个新的唯一数组。

$unique = array();
foreach ($row as $value)
{
    $key = $value['PID'];
    if (isset($unique[$key]))
    {
        $unique[$key]['StatsID'] .= ' ' . $value['StatsID'];
    }
    else
    {
        $unique[$key] = $value;
    }
}

现在,$unique将为您提供您正在寻找的结果,您可以循环遍历唯一数组并输出结果(如果需要,我还添加了计数器):

$count = count($unique);
foreach ($unique as $row)
{
    echo "<tr><td>{$row['PID']} {$row['TID']} {$row['StatsID']} </td></tr>";
}