Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从另一个数组创建一个数组_Php_Arrays - Fatal编程技术网

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

Php 从另一个数组创建一个数组,php,arrays,Php,Arrays,我一直在寻找这个,但找不到它,虽然很难用语言表达出来,所以如果它被其他地方覆盖,我道歉 我做了一个API调用,它给了我这个。这是在给定日期工作的班次,每个班次都有一个数组。这就是一个人的样子 $lastMon = array{ date => $date hours => 8 worker => mjones etc } 现在,我想获取招聘人员值和工时值,并创建另一个如下所示的数组 $lastMonData

我一直在寻找这个,但找不到它,虽然很难用语言表达出来,所以如果它被其他地方覆盖,我道歉

我做了一个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
}
您可以使用来汇总招聘人员的工作时间:

$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");

我知道总和可以通过其他方式计算,但我尝试保留使用array_reduce的示例。

到目前为止您尝试了什么,您的具体问题是什么?通过第一个数组循环并在此期间创建第二个数组有什么问题?我想我理解你的要求,但我需要看一个输入数据的真实示例来解释如何做到这一点。一般来说,如果您提供的示例是真正的可解析PHP代码,或者至少是var_dump/printr输出,那么在这里提问会得到更好的结果。您可以发布预期的输出吗。此外,没有“招聘人员”价值。会是什么?我会发布我正在看的东西。我也把招聘人员换成了工人。很抱歉。但我得到的是另一个数组的值。我需要那里的唯一值,即名称,然后作为新数组中的键,它们的值是每个名称的原始数组中的小时键的总和。然后我还要把所有名字的所有小时加起来。但我会在一分钟内发布整个原始阵列。这正是我要寻找的。我就是不能让它工作。抱歉,昨天是漫长的一天,但$lastMon来自simplexml\u load\u字符串,因此它是一个对象而不是数组。我怎样才能改变这一点来解释它呢?但这就是我想要它做的,将招聘人员的关键值组合起来,这样就不会有任何重复,然后将招聘人员重复的小时数值组合起来。你可以使用rock man
Array([Gloria M]=>13[Shana A]=>3[Cynthia W]=>14[Tony C]=>4[Alexandra C]=>5[Sarah D]=>12[Lindsey S]=>4[Casi D]=>7[Salina T]=>4[Madeline S]=>4[Max M]=>7[Jeanine S]=>16[Michael B]=>2[Gretchen D]=>3[total]=>98)
因此,这实际上并不是100%有效。因为这是一个日期时间,所以不能正确地相加。我试图找到答案,但我想我会问你。我最后有点不对劲,因为使用+=它试图将“小时”视为字符串,但它是一个日期时间。我不知道如何调整函数以使用“添加”日期间隔函数?在您的问题中,
hours
where字符串,我们将它们添加为整数(PHP将理解它们是数字).你说的数据时间是什么意思?我没有使用
shiftStartTime
键。如果你想动态计算小时数,你可以使用它,这是绝对正确的,它是一个整数。所以,发生的事情是它被错误地添加了。所有的时间要么是一小时的顶部,要么是15分钟的间隔。然而,我最终得到了一个非常奇怪的时间。我将%I放入格式中以查看会议记录,这就是我得到的结果。它是通过序列化和非序列化来实现的吗?名称“d:165.5;s:15:”名称“d:19920000000002;s:11:”名称“d:203.150000000003;s:13:”名称“d:93.6;s:13:”名称“d:16.6;s:0:”;I:0;s:16:”名称“d:141.649999999998”
Array
(
    [John Smith] => 13
    [Mike Jones] => 4
    [total] => 17
)