Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 使用数组_intersect将数组与重复值进行比较?_Php_Arrays_Array Intersect - Fatal编程技术网

Php 使用数组_intersect将数组与重复值进行比较?

Php 使用数组_intersect将数组与重复值进行比较?,php,arrays,array-intersect,Php,Arrays,Array Intersect,我正在为我的目录设计一个包引擎。在这里,您可以添加一定数量的产品到包装和折扣。当您订购产品时,脚本必须检测哪些套餐交易适用于您的订单 这是我的密码: // packages $packages["package1"] = array(1,1,2); $packages["package2"] = array(1,2); //orderlist $orderlist = array(1,1,2,1,2,2); // put the order list in a temp array $tem

我正在为我的目录设计一个包引擎。在这里,您可以添加一定数量的产品到包装和折扣。当您订购产品时,脚本必须检测哪些套餐交易适用于您的订单

这是我的密码:

// packages
$packages["package1"] = array(1,1,2);
$packages["package2"] = array(1,2);

//orderlist
$orderlist = array(1,1,2,1,2,2);

// put the order list in a temp array
$temp_product_array = $orderlist;

foreach($packages as $pname => $package_array)
{
  $no_more_package = 0;
  do
  {
    // put the package products in a temp array
    $temp_package_array = $package_array;

    $is_packages_array = array_intersect($temp_package_array,$temp_product_array);

    // if all package values are present
    if(count($is_packages_array) == count($temp_package_array))
    {
      // add package name
      $packages_in_order[] =  $pname;

      // filter the package out of the product list but keep duplicate values
      foreach($temp_product_array as $key1 => $pid1)
      {
        foreach($temp_package_array as $key2 => $pid2)
        {
          if($pid1==$pid2)
          {
            unset($temp_product_array[$key1]);
            unset($temp_package_array[$key2]);
            break;  // after removing go to the next product to prevent double erasing
          }
        }
      }
    }
    else
    {
      $no_more_package = 1;
    }

  }
  while($no_more_package<1);
}

print_r($packages_in_order);
print_r($temp_product_array);
但我希望结果是:

Array ( [0] => package1 [1] => package2 ) Array ( [5] => 2 )
我尝试了
array\u diff
array\u intersect
,但它们都不能很好地处理重复的值

有没有人有更好的解决方法?

(由于不同的来源,我无法使用关联数组)

我想解决这个问题。其中一部分是在列表中查找包。在一个可能相关的问题中命名为
连续_值
的现有函数

使用它,可以在另一个数组中按精确顺序定位一个数组。这可能是你想要的

剩下的部分是搜索软件包,非常简单。如果您正确理解了您的问题,那么您还需要返回遗留问题:

list($found, $rest) = find_packages($packages, $orderlist);
var_dump($found, $rest);

function find_packages(array $packages, array $list)
{
    $found = array();
    foreach($packages as $name => $package) {
        # consecutive_values() is @link https://stackoverflow.com/a/6300893/367456
        $has = consecutive_values($package, $list);
        if ($has === -1) continue;
        $found[] = $name;
        array_splice($list, $has, count($package));
    }

    return array($found, $list);
}
输出:

array(2) {
  [0] =>
  string(8) "package1"
  [1] =>
  string(8) "package2"
}
array(1) {
  [0] =>
  int(2)
}
编辑:多次搜索同一个包需要稍加修改。此处创建了一个内部while循环,如果未找到当前包,则需要中断该循环:

function find_packages(array $packages, array $list)
{
    $found = array();
    foreach($packages as $name => $package) {
        while (true) {
            # consecutive_values() is @link https://stackoverflow.com/a/6300893/367456
            $has = consecutive_values($package, $list);
            if ($has === -1) break;
            $found[] = $name;
            array_splice($list, $has, count($package));
        }
    }

    return array($found, $list);
}
//包
$packages[“package1”]=数组(1,1,2);
$packages[“package2”]=数组(1,2);
//订单列表
$orderlist=数组(1,1,1,2,2);
//将订单列表放入临时数组中
$temp\U product\U array=$orderlist;
$product\U count\U array=数组\U count\U值($temp\U product\U array);
foreach($pname=>$temp\u package\u数组形式的包)
{
$no_more_package=0;
做
{
$test_package_array=array();
foreach($temp\u package\u数组作为$key=>$pid)
{
//检查产品是否仍在订单中
if(isset($product\U count\U array[$pid])&&$product\U count\U array[$pid]>0)
{
$product_count_数组[$pid]--;
$test_package_array[]=$pid;
}
其他的
{
$no_more_package=1;
}
}
//检查找到的产品是否与包装数量相符
if(计数($temp\u包\u数组)=计数($test\u包\u数组))
{
$packages\u顺序[]=$pname;
}
其他的
{
//如果包装不完整,则添加提取的产品
foreach($test\u package\u数组作为$pid)
{
$product_count_数组[$pid]++;
}
}
}

而($no_more_packageSo订单列表必须包含与包相同的产品(且顺序相同)才能匹配?订单列表包含任何可能顺序的任意数量的产品ID。(在脚本中,包是按折扣订购的。)这很好用。我将用更多的软件包和产品想法来测试它。谢谢!!我在同一时刻也有一个突破点。我将发布我的解决方案。我对解决这个问题的最佳方法很好奇。我会一直将问题分为函数。代码更容易理解和更改。你也可以测试叶函数如果我改变包的顺序,结果应该是:数组([0]=>package1[1]=>package1[2]=>package1)数组([1]=>0[2]=>0),但是这个解决方案给出了:数组(2){[0]=>string(8)“package1”[1]=>string(8)“package2”}数组(1){[0]=>int(2)}啊,好吧,你想多次寻找同一个包裹,我不清楚。这是一个轻微的变化,我添加了它,并解释了一点。
function find_packages(array $packages, array $list)
{
    $found = array();
    foreach($packages as $name => $package) {
        while (true) {
            # consecutive_values() is @link https://stackoverflow.com/a/6300893/367456
            $has = consecutive_values($package, $list);
            if ($has === -1) break;
            $found[] = $name;
            array_splice($list, $has, count($package));
        }
    }

    return array($found, $list);
}
// packages
$packages["package1"] = array(1,1,2);
$packages["package2"] = array(1,2);

//orderlist
$orderlist = array(1,1,1,2,2,2);



// put the order list in a temp array
$temp_product_array = $orderlist;
$product_count_array = array_count_values($temp_product_array);

foreach($packages as $pname => $temp_package_array)
{
  $no_more_package = 0;
  do
  {
    $test_package_array = array();

    foreach($temp_package_array as $key => $pid)
    {
      // check if the product is still in the order totals 
      if(isset($product_count_array[$pid]) && $product_count_array[$pid]>0)
       {
         $product_count_array[$pid]--;
         $test_package_array[] = $pid;
       }
       else
       {
         $no_more_package = 1;
       }
    }
    // check if the found products match the package count
    if(count($temp_package_array)==count($test_package_array))
    {
      $packages_in_order[] = $pname;
    }
    else
    {
      // add the extracted products in case of incomplete package 
      foreach($test_package_array as $pid)
       {
         $product_count_array[$pid]++;
       }
    }


  }
  while($no_more_package<1);
}

print_r($packages_in_order);
print_r($product_count_array);