Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
Javascript php是否有内置的数组函数,可以为布尔结果排序/赋值?_Javascript_Php_Sorting_Multidimensional Array - Fatal编程技术网

Javascript php是否有内置的数组函数,可以为布尔结果排序/赋值?

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] =>

我有一个订单数组,key代表订单#。每个元素都包含一个员工数组,这些员工可以完成由员工编号表示的订单

范例

[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
  • 以最少的订单数量获取员工e
  • 以最少的员工数量获取e的订单o
  • 订单中删除eo
  • 从1开始重复

  • 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));