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