Javascript php是否有内置的数组函数,可以为布尔结果排序/赋值?
我有一个订单数组,key代表订单#。每个元素都包含一个员工数组,这些员工可以完成由员工编号表示的订单 范例Javascript php是否有内置的数组函数,可以为布尔结果排序/赋值?,javascript,php,sorting,multidimensional-array,Javascript,Php,Sorting,Multidimensional Array,我有一个订单数组,key代表订单#。每个元素都包含一个员工数组,这些员工可以完成由员工编号表示的订单 范例 [0] => // <-- order# [0] => 0, [1] => 1, [2] => 2 [1] => [0] => 0, [1] => 1, [2] => 2 [2] => [0] => 3 [3] => [0] =>
[0] => // <-- order#
[0] => 0,
[1] => 1,
[2] => 2
[1] =>
[0] => 0,
[1] => 1,
[2] => 2
[2] =>
[0] => 3
[3] =>
[0] => 3
[0]=>//0,
[1] => 1,
[2] => 2
[1] =>
[0] => 0,
[1] => 1,
[2] => 2
[2] =>
[0] => 3
[3] =>
[0] => 3
因此,订单0可以由员工0、1或2完成。
我也要一份。
订单2和订单3只能由员工3执行
我需要返回bool,如果每个订单都有一个唯一的员工来完成它,这是真的。因此,在本例中,返回false,因为只有一名员工可以完成订单2和订单3,并且不能同时分配给这两名员工
我希望这是有道理的。在我的手机上点击这个agh这是我快速编写的一个php函数,可以满足您的需求,我已经快速测试了它,它似乎工作正常
<?php
function compare($orders){
if(sizeof($orders) == 0){
return 1;
}
$quantity = array();
foreach ($orders as $order) {
if(sizeof($order) == 0){
return 0;
}
foreach ($order as $employee) {
if(array_key_exists($employee, $quantity)){
$quantity[$employee]++;
}
else{
$quantity[$employee] = 1;
}
}
}
$chosenEmployees = array_keys($quantity, min($quantity));
$chosenEmployee = $chosenEmployees[0];
$length = array();
foreach ($orders as $key => $order) {
$length[$key] = sizeof($order);
}
for ($i=0; $i < sizeof($orders); $i++) {
$chosenOrders = array_keys($length, min($length));
foreach ($chosenOrders as $orderKey) {
if(in_array($chosenEmployee, $orders[$orderKey])){
unset($orders[$orderKey]);
foreach ($orders as $key1 => $order) {
foreach ($order as $key2 => $employee) {
if($employee == $chosenEmployee){
unset($orders[$key1][$key2]);
}
}
}
return compare($orders);
}
else{
unset($length[$orderKey]);
}
}
}
}
$out = compare($orders);
?>
要使用它,请键入compare($your_array_name),函数将返回0(false)或1(true)。希望有帮助。
编辑:
我怀疑你会在其他地方找到这段代码,因为我是为这个问题写的。
我一直在努力证明,并且可以证明当函数返回true时,它就是true。
函数返回true。
=>订单数组为空。
=>在此之前,订单数组包含至少一名员工可以完成的订单。
=>在此之前,订单数组包含两个订单,可以分别由至少一名员工和两名员工完成。
通过重复,我们可以推断,在结束之前的n个步骤中,有n个订单,所有订单都至少由一个唯一的员工执行。
如果n=初始数组的大小,我们可以得出结论,如果函数返回true,则它是正确的。
如果此证明不正确,请告诉我。如果我找到下半年的证据,我将再次编辑我的帖子。一个解决方案是使用
array\u reduce
和array\u diff
推测性地将员工分配给订单
//Each step tries to add another employee id to the $carry array
function calc($carry, $item)
{
if (!$carry) {
$carry = array();
}
$diff = array_diff($item, $carry);
if (count($diff) > 0) {
array_push($carry, reset($diff));
}
return $carry;
}
function cmp($a, $b)
{
return count($a) - count($b);
}
function checkCondition($arrayToCheck)
{
uasort($arrayToCheck, 'cmp');
$reduced = array_reduce($arrayToCheck, "calc");
//If we have a shorter array than the number of orders, we have a problem
return count($reduced) == count($arrayToCheck);
}
$o = array(
array(0,1,2),
array(0,1,2),
array(3),
array(3),
);
$result = checkCondition($o);
echo $result + " " + $result ? "Good" : "Bad"; //Should be Bad
$o = array(
array(0,1,2),
array(0,1,2),
array(1),
array(3),
);
$result = checkCondition($o);
echo $result + " " + $result ? "Good" : "Bad"; //Should be Good
首先对数组进行排序可以避免将工作人员“分配”到必须分配到后续订单的订单的问题。算法
你的主要问题是关于算法。如前所述,语言是次要的
你想要的是
检查是否可以为每个订单分配一名员工和每个员工
员工分配了一个或没有订单
您可以将其绘制为图形:
- 节点是订单和员工
- 链接是可能的作业
- 每个员工节点只剩下一个链接或没有链接,并且
- 每个订单节点仍有一个(或多个)链接
true
。否则,它应该返回false
编辑:J.Quick发现这很有效。我很想得到它的证据或者他在哪里找到它的参考资料 所以我在这里解释:
true
false
JavaScript实现 您可以这样运行它:
const orders = [
[0,1,2],
[0,1,2],
[3],
[3]
];
console.log(areAllOrdersFulfilled(orders));
按照约定,我可以准备一个JS答案。非常感谢。我非常感谢你的帮助。让我知道,如果有任何关于现有“数组函数”的问题是非常乐观的,因为这是一个非常重要的问题。“这可能是一个可行的方法。”德克塞同意。我的第一个冲动是建议使用
数组映射
,但它更复杂。必须有一种方法在没有4层嵌套循环的情况下实现这一点。对算法的解释会很好;这是非常密集的…抱歉,我现在没有时间解释。这个递归函数背后的思想是计算每个人出现的次数,以及可以完成每个任务的不同人员的数量,从而计算$quantity和$length变量。之后,我们检查谁的可用性最差,并将拥有最少解决问题的人员的任务删除,并将他从其他任务中删除。如果下一次调用函数时目标列表为空,则可以展开任务。如果有一个任务没有可用的人员(即空数组),我们得出结论,我们不能。如果我有时间,我会用适当的方法更新答案explanations@J.Quick我会给你的;它起作用了。我一直无法找到一个组合,在摆弄了一段时间后,它给出了错误的输出while@WilliamPerron说得好。我已经编辑了一个补丁。TBF,这是一个非常简单的方法。我还没有完全测试过。我喜欢这个解决方案:它简单明了。谢谢你,拉法梅克斯。我感谢你的解释和你在这方面的时间。我要给jquick支票。他给出了很好的答案,但没有多少要点。希望你能理解。再次感谢+++1@BrianPatterson字体别担心,我在这里学到了一些东西。既然你已经有了答案,为什么还要打开“赏金”?不管怎样,你说的很好。
const orders = [
[0,1,2],
[0,1,2],
[3],
[3]
];
console.log(areAllOrdersFulfilled(orders));