Diff 2数组并删除缺少的元素

时间:2014-08-11 18:07:02

标签: php arrays match element array-unset

我尝试使用相同数量元素的较小数组中的某些信息更新更大的数组。每24小时生成一个更大的数组,但每4小时生成一个较小的数组,但有时在较小的数组中少数元素,所以我想从更大的数组中删除这些元素,但我怎么能这样做?

这是较小数组的第一个元素:

  array(5) {
    ["category_id"]=>
    string(1) "8"
    ["product_url"]=>
    string(58) "http://example.net/?id=1752"
    ["price_bgn"]=>
    float(142.8)
    ["price_eur"]=>
    float(72.99)
    ["quantity"]=>
    int(5)
  }

这是更大数组的第一个元素:

array(23) {
  ["product_id"]=>
  string(4) "1752"
  ["product_sku"]=>
  string(7) "SKU1752"
  ["category_id"]=>
  string(1) "8"
  ["product_url"]=>
  string(58) "http://example.net/?id=1752"
  ["additional_images"]=>
  array(4) {
    [0]=>
    string(64) "http://example.net/vario.jpg"
    [1]=>
    string(73) "http://example.net/duraflex_logo1.jpg"
    [2]=>
    string(67) "http://example.net/YKK-logo.jpg"
    [3]=>
    string(67) "http://example.net/Air-mesh.jpg"
  }
  ["variants"]=>
  array(4) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
    [2]=>
    string(1) "3"
    [3]=>
    string(1) "4"
  }
  ["related_products"]=>
  array(4) {
    [0]=>
    array(2) {
      ["product_id"]=>
      string(2) "18"
      ["product_sku"]=>
      string(5) "SKU18"
    }
    [1]=>
    array(2) {
      ["product_id"]=>
      string(3) "248"
      ["product_sku"]=>
      string(6) "SKU248"
    }
    [2]=>
    array(2) {
      ["product_id"]=>
      string(4) "1755"
      ["product_sku"]=>
      string(7) "SKU1755"
    }
    [3]=>
    array(2) {
      ["product_id"]=>
      string(4) "1833"
      ["product_sku"]=>
      string(7) "SKU1833"
    }
  }
  ["manufacturer_id"]=>
  string(1) "1"
  ["quantity"]=>
  int(5)
  ["metadescription_bg"]=>
  string(233) ""
  ["detaileddescription_bg"]=>
  string(5342) ""
  ["metadescription_en"]=>
  string(159) ""
  ["metakeywords_en"]=>
  string(38) ""
  ["name_en"]=>
  string(38) ""
  ["price_eur"]=>
  float(72.99)
  ["shortdescription_en"]=>
  string(138) ""
  ["detaileddescription_en"]=>
  string(2485) ""
  ["images_url"]=>
  string(51) "http://example.net/?idpics=3948"
  ["images"]=>
  array(4) {
    [0]=>
    string(50) "http://example.net/pic6129.jpg"
    [1]=>
    string(50) "http://example.net/pic6164.jpg"
    [2]=>
    string(50) "http://example.net/pic6165.jpg"
    [3]=>
    string(50) "http://example.net/pic5745.jpg"
  }
}

因此,如果我匹配产品网址,我会更新价格。但是如果较小的数组中没有匹配的url,如何从较大的数组中删除元素?这是更新代码:

            foreach($this->productLinks as $product) {
                foreach($this->productLinksOld as $k => $productOld) {
                    if($product['product_url'] == $productOld['product_url']) {
                        $this->productLinksOld[$k]['price_bgn'] = $product['price_bgn'];
                        $this->productLinksOld[$k]['price_eur'] = $product['price_eur'];
                        $this->productLinksOld[$k]['quantity'] = $product['quantity'];
                    }
                }
            }

欢呼声, 乔治!

1 个答案:

答案 0 :(得分:0)

我做了一点检查,但我不知道这是最好的方法。这是代码:

$links = unserialize(file_get_contents($this->_tempProductLinksFile));
$links[] = array(
    'category_id' => 8,
    'product_url' => 'http://www.example.net/?id=1752123',
    'price_bgn' => 1.2,
    'price_eur' => 0.6,
    'quantity' => 15,
);
$products = unserialize(file_get_contents($this->_tempFullProductInfoFile));
echo count($links).' | '.count($products).'<br />';
foreach($links as $l) {
    $ll[] = $l['product_url'];
}
foreach($products as $p) {
    $pp[] = $p['product_url'];
}
foreach($products as $k => $pm) {
    if(!in_array($pm['product_url'], $ll)) {
        echo 'This key doesn\'t exists in small array '.$k.'<br />';
    }
}
foreach($links as $k => $lm) {
    if(!in_array($lm['product_url'], $pp)) {
        echo 'This key doesn\'t exists in big array '.$k.'<br />';
    }
}

首先获得小数组的缓存内容作为链接,将大数组作为产品。然后我创建新的子数组到链接,以检查大小数组中是否是没有完整信息的产品。毕竟我计算了2个数组,结果是:

1501 | 1503

然后我只在其他数组中获取产品URL以检查其他数组中的每个产品网址,结果是:

This key doesn't exists in small array 44
This key doesn't exists in small array 313
This key doesn't exists in small array 685
This key doesn't exists in big array 1500

这意味着链接中的最后一条记录(手动创建)不存在于大数组中,而来自products数组的其他3条网址在小数组中不存在。此代码的运行时间在我的旧家用机器上大约200ms,这对我来说足够了:)

如果有人能给我一个更好的解决方案,我将非常感激:)

欢呼,乔治!