按一个键值折叠多维数组,同时汇总另一个键值

时间:2016-09-15 10:11:18

标签: php arrays multidimensional-array

我一直在制造恶劣天气,但我几乎就在那里。

我有一系列带有付款值的员工(代码)列表,并且同一个代码的多个条目有不同的付款。

我正在尝试在汇总付款值时折叠重复的代码。

以下是调试回声的示例代码:

<?


$temprows = array(
    array('empcode' => 3222, 'userfirstname' => 'Ted', 'usersurname' => 'Smyth', 'value' => 1000.00),
    array('empcode' => 3222, 'userfirstname' => 'Ted', 'usersurname' => 'Smyth', 'value' => 1337.93),
    array('empcode' => 3422, 'userfirstname' => 'Lynn', 'usersurname' => 'Byrne', 'value' => 346.47),
    array('empcode' => 3422, 'userfirstname' => 'Lynn', 'usersurname' => 'Byrne', 'value' => 6.95),
    array('empcode' => 3436, 'userfirstname' => 'Dave', 'usersurname' => 'Smith', 'value' => 233),
    array('empcode' => 3436, 'userfirstname' => 'Dave', 'usersurname' => 'Smith', 'value' => 3455),
);

$now=date("Y-m-d H:i:s"); 

$output_arr=[];
$empcodes_used=array();

$j=0;

foreach ($temprows as $arr) {

    // if empcode not encountered yet   
    if (!in_array($arr["empcode"], $empcodes_used)) {

        // Create new row
        echo("new row empcode =".$arr["empcode"]."<br><br>");
        $output_arr[$j]["empcode"]=$arr["empcode"];
        $output_arr[$j]["userfirstname"]=$arr["userfirstname"];
        $output_arr[$j]["usersurname"]=$arr["usersurname"];
        $output_arr[$j]["value"]=$arr["value"];
        $output_arr[$j]["paid"]=$now;

        // Add emcpode to empcodes_used
        array_push($empcodes_used, $arr["empcode"]);

        $j++;

    } else {
        // IN ENGLISH: Find the $output_arr with this empcode and increment it's value by the value of this arr
        echo("empcode used=".$arr["empcode"]."<br>");
        $k=0;
        foreach ($output_arr as $foo) {
            echo("k=".$k."<br>");
            echo("foo empcode=".$foo["empcode"]." and arr empcode=".$arr["empcode"]."<br>");
            if ($foo["empcode"]==$arr["empcode"]) {
                // Increment the payment value of that empcode
                echo("foo empcode = arr empcode<br>");
                $foo["value"]+=$arr["value"];
                $output_arr[$k]["value"]=$foo["value"];
                echo("foo value=".$foo["value"]."<br><br>");
                $k++;
            }

        }               
    }

}
echo("<pre>");
    print_r($output_arr);
    echo("</pre>");
?>

这是我想要的数组:

Array
(
    [0] => Array
        (
            [empcode] => 3222
            [userfirstname] => Ted
            [usersurname] => Smyth
            [value] => 2337.93
            [paid] => 2016-09-15 10:51:30
        )

    [1] => Array
        (
            [empcode] => 3422
            [userfirstname] => Lynn
            [usersurname] => Byrne
            [value] => 353.42
            [paid] => 2016-09-15 10:51:30
        )

    [2] => Array
        (
            [empcode] => 3436
            [userfirstname] => Dave
            [usersurname] => Smith
            [value] => 3688
            [paid] => 2016-09-15 10:51:30
        )

)

但这是我从上面的代码中获得的:

new row empcode =3222

empcode used=3222
k=0
foo empcode=3222 and arr empcode=3222
foo empcode = arr empcode
foo value=2337.93

new row empcode =3422

empcode used=3422
k=0
foo empcode=3222 and arr empcode=3422
k=0
foo empcode=3422 and arr empcode=3422
foo empcode = arr empcode
foo value=353.42

new row empcode =3436

empcode used=3436
k=0
foo empcode=3222 and arr empcode=3436
k=0
foo empcode=3422 and arr empcode=3436
k=0
foo empcode=3436 and arr empcode=3436
foo empcode = arr empcode
foo value=3688

Array
(
    [0] => Array
        (
            [empcode] => 3222
            [userfirstname] => Ted
            [usersurname] => Smyth
            [value] => 3688
            [paid] => 2016-09-15 10:51:30
        )

    [1] => Array
        (
            [empcode] => 3422
            [userfirstname] => Lynn
            [usersurname] => Byrne
            [value] => 346.47
            [paid] => 2016-09-15 10:51:30
        )

    [2] => Array
        (
            [empcode] => 3436
            [userfirstname] => Dave
            [usersurname] => Smith
            [value] => 233
            [paid] => 2016-09-15 10:51:30
        )

)

必须是

$output_arr[$k]["value"]=$foo["value"];

这是错误的。

我真的很感激任何建议。从昨天开始,我一直在摇头。 TIA。

2 个答案:

答案 0 :(得分:0)

这是一种方法:

$rows = array();
foreach($temprows as $temprow){
  $empcode = $temprow['empcode'];

  if(!isset($rows[$empcode])){
    $rows[$empcode] = array(
      'empcode' => $empcode,
      'userfirstname' => $temprow['userfirstname'],
      'usersurname' => $temprow['usersurname'],
      'value' => 0,
      'paid' => date("Y-m-d H:i:s"),
    );
  }

  $rows[$empcode]['value'] += $temprow['value'];
}

希望这有帮助。

答案 1 :(得分:0)

试试这个:

    $tempRows   = array(
        array('empcode' => 3222, 'userfirstname' => 'Ted', 'usersurname' => 'Smyth', 'value' => 1000.00),
        array('empcode' => 3222, 'userfirstname' => 'Ted', 'usersurname' => 'Smyth', 'value' => 1337.93),
        array('empcode' => 3422, 'userfirstname' => 'Lynn', 'usersurname' => 'Byrne', 'value' => 346.47),
        array('empcode' => 3422, 'userfirstname' => 'Lynn', 'usersurname' => 'Byrne', 'value' => 6.95),
        array('empcode' => 3436, 'userfirstname' => 'Dave', 'usersurname' => 'Smith', 'value' => 233),
        array('empcode' => 3436, 'userfirstname' => 'Dave', 'usersurname' => 'Smith', 'value' => 3455),
    );

    $now        =   date("Y-m-d H:i:s");
    $uniqueRows = [];

    foreach($tempRows as $tempRow){
        $key                            = $tempRow['userfirstname'] . "_" . $tempRow['userfirstname'];
        if(!array_key_exists($key, $uniqueRows)){
            $uniqueRows[$key]           = $tempRow;
            $uniqueRows[$key]['paid']   = $now;
        }else{
            $uniqueRows[$key]['value'] = $uniqueRows[$key]['value'] + $tempRow['value'];
        }
    }

    // FILTER THE RESULTS ONLY:
    $uniqueRows = array_values($uniqueRows);
    var_dump($uniqueRows);