从另一个数组值创建一个数组

时间:2018-12-19 00:31:50

标签: php arrays

我一直在搜索并且找不到它,尽管很难用语言表达,所以如果它在其他地方被提及,我深表歉意。

我进行了一个API调用,这给了我。这是在给定日期工作的班次,每个班次都有一个数组。这就是样子。

$lastMon = array{
       date => $date
       hours => 8
       worker => mjones
       etc
       }

现在,我想获取招聘者的价值和小时数,并创建另一个看起来像这样的数组

$lastMonData = array{
       key for each $lastMon->recruiter => sum of all $lastMon->hours where recruiter is unique
       total += $lastMon->hours
       }

基本上,我从该系统中提取了一堆班次,并将其转变为数组,并插入了从系统其他部分提取的一些键。然后,我需要一个按日期排列的数组,其中包含当天所有班次的总工作时间,然后是招聘人员密钥中每个唯一名称的密钥,该密钥将同一阵列中提到的工时加起来。我希望这是有道理的。

编辑:

这是一个例子

SimpleXMLElement Object
(
    [orderId] => 4000262
    [status] => filled
    [shiftStartTime] => 2018-12-10T07:30:00
    [shiftEndTime] => 2018-12-10T12:30:00
    [tempId] => 80231
    [firstName] => SimpleXMLElement Object
        (
        )

    [lastName] => SimpleXMLElement Object
        (
        )

    [clientId] => 42642
    [clientName] => SimpleXMLElement Object
        (
        )

    [regionName] => SimpleXMLElement Object
        (
        )

    [orderSpecialty] => School
    [orderCertification] => RN
    [floor] => SimpleXMLElement Object
        (
        )

    [shiftNumber] => 1
    [note] => SimpleXMLElement Object
        (
        )

    [payrollNumber] => SimpleXMLElement Object
        (
        )

    [lessLunchMin] => SimpleXMLElement Object
        (
        )

    [dateTimeCreated] => 2018-08-17T09:33:43
    [takenBy] => 592
    [bookedByUserId] => 592
    [orderTypeId] => 1
    [orderType] => SimpleXMLElement Object
        (
        )

    [city] => Holmdel
    [state] => NJ
    [zipCode] => 07733
    [orderSourceID] => SimpleXMLElement Object
        (
        )

    [orderSourceName] => SimpleXMLElement Object
        (
        )

    [lt_orderID] => 13643
    [dateTimeModified] => 2018-08-17T09:33:43
    [recruiter] => John Smith
    [hours] => 05
)
SimpleXMLElement Object
(
    [orderId] => 4002473
    [status] => filled
    [shiftStartTime] => 2018-12-10T09:00:00
    [shiftEndTime] => 2018-12-10T13:30:00
    [tempId] => 1397353
    [firstName] => SimpleXMLElement Object
        (
        )

    [lastName] => SimpleXMLElement Object
        (
        )

    [clientId] => 47597
    [clientName] => SimpleXMLElement Object
        (
        )

    [regionName] => SimpleXMLElement Object
        (
        )

    [orderSpecialty] => School
    [orderCertification] => RN
    [floor] => SimpleXMLElement Object
        (
        )

    [shiftNumber] => 1
    [note] => SimpleXMLElement Object
        (
        )

    [payrollNumber] => SimpleXMLElement Object
        (
        )

    [lessLunchMin] => SimpleXMLElement Object
        (
        )

    [dateTimeCreated] => 2018-08-20T08:53:23
    [takenBy] => 592
    [bookedByUserId] => 592
    [orderTypeId] => 1
    [orderType] => SimpleXMLElement Object
        (
        )

    [city] => Tinton Falls
    [state] => NJ
    [zipCode] => 07701
    [orderSourceID] => SimpleXMLElement Object
        (
        )

    [orderSourceName] => SimpleXMLElement Object
        (
        )

    [lt_orderID] => 0
    [dateTimeModified] => 2018-08-20T10:05:33
    [recruiter] => Mike Jones
    [hours] => 04
)

我需要获取招聘者的价值,并将这些价值放入新数组中的键中。重复一些,所以我只想选择独特的。然后,该数组中的小时数将是新数组中招聘人员姓名键的值。

所以这看起来像

$lastMon = array{
      Mike Jones => 4
      John Smith => 5
      Total => 9
}

1 个答案:

答案 0 :(得分:0)

您可以使用array-reduce来汇总招聘人员的时间:

$lastMon = array(array("recruiter" => "AAA", "hours" => 4), array("recruiter" => "BBB", "hours" => 5), array("recruiter" => "AAA", "hours" => 3));

function reduceHours($carry, $item)
{
    if (!array_key_exists($item["recruiter"], $carry))
        $carry[$item["recruiter"]] = 0;
    $carry[$item["recruiter"]] += $item["hours"];
    return $carry;
}


$lastMonData = array_reduce($lastMon, "reduceHours", array());

这将输出:

Array
(
    [AAA] => 7
    [BBB] => 5
)

已编辑

现在您添加了更多数据,我可以为您提供更详细的答案:

$str = '<xml><shifts><recruiter>John Smith</recruiter><hours>05</hours></shifts><shifts><recruiter>Mike Jones</recruiter><hours>04</hours></shifts><shifts><recruiter>John Smith</recruiter><hours>08</hours></shifts></xml>';
$arr = json_decode(json_encode((array) simplexml_load_string($str)), 1);

function sum($carry, $item) { return $carry + $item;}
function reduceHours($carry, $item)
{
    if (!array_key_exists($item["recruiter"], $carry))
        $carry[$item["recruiter"]] = 0;
    $carry[$item["recruiter"]] += $item["hours"];
    return $carry;
}

$lastMonData = array_reduce($arr["shifts"], "reduceHours", array());
$lastMonData["total"] = array_reduce($lastMonData, "sum");

将xml对象转换为数组来自here

这将为$lastMonData提供输出:

Array
(
    [John Smith] => 13
    [Mike Jones] => 4
    [total] => 17
)

我知道总数的总和可以用其他方法完成,但我尝试保留使用array_reduce的示例。

相关问题