我该如何清理阵列?

时间:2013-12-11 23:26:03

标签: php arrays

我有一个数组,它是产品可能的所有尺寸的集合,Magento使用EAV数据库结构,因此数组的格式如下

entity_id => 'text',

28709 => 'L'
28734 => 'S'
28732 => 'XL'
28721 => '22B'
28705 => '16'

我发布的只是一个小样本,数组变得非常大(超过10,000)

现在我有另一个像这样格式化的数组

size_entity_id => product_entity_id

28734 => '7314895'
28709 => '7365374'
28732 => '7382004'

我如何使用这两个数组是我为第一个数组的每个(以foreach($sizeArray as $_index => $_value)的格式)执行a并使用isset

现在我想我可以改进代码,而不必通过清理第一个数组来重新编码其他人的工作,因为第二个数组最多只有10个大小

我想知道是否有一个很好的简单解决方案来清理我的第一个阵列而不必做这样的事情

foreach($sizeArray as $_index => $_value)
{
    if(!isset($products[$_index]))
    {
        unset($sizeArray[$_index])
    }
}

因为如果我这样做,我将通过数组中的所有值,如果我没有这样做,并保持代码如何工作现在95%的时间它不会通过整个数组(其他5%的大小接近数组的末尾,它仍会通过数组并接近结束)

注意:代码是如何工作的很好,但由于我没有开发它,我不想重新编写别人的工作,当我不完全理解它时,如果找到地方,我一直在做的任务我可以改进它(即,将工作数量从10,000减少到10)

编辑:好吧,我似乎错过了一件事,第一个阵列,你可以看到前3个值是L,S和XL,代表大,小和超大,在foreach之前有一些代码我描述了哪种分类使得S将在L之前以这种方式从最小尺寸开始,无论产品可能具有什么尺寸,因为我采取的样本如果我离开了它未能反映阵列中的潜在间隙代码原样,这里是大小为16和17之间的排序数组的样本

##### => '16'
##### => '16A'
##### => '16B'
##### => '16C'
##### => '16S'
##### => '16M'
##### => '16L'
##### => '16½'
##### => '16>'
##### => '17'

现在我不知道排序是如何完成的,但除了它在数组中排序了近10,000个项目的事实(因为它是一个在其他人使用的函数处理它,因为它在他们的工作中出现问题,我正在看的代码似乎只用于控制循环迭代的方向)如果第二个数组的大小为16,大小为17,第一个数组没有被清理,它将在16处进行,跳过虽然每一个值都达到17,这意味着失败isset之前检查8次是真的,这是我认为最小的例子,magento的问题是每次产品的所有尺寸即使目录的2 / 3s将使用XS - > XL尺寸的缩放

3 个答案:

答案 0 :(得分:1)

我想你可以走向另一个方向:

$newSizeArray = array();
foreach ($products as $i => $index)
    if (isset($sizeArray[$index]))
        $newSizeArray[$index] = $sizeArray[$index];
$sizeArray = $newSizeArray;

答案 1 :(得分:1)

您可以使用array_intersect_key()函数,该函数在一次调用中为您提供两个for()循环的结果。

http://www.php.net/function.array-intersect-key

它可能会更快,因为那是用C或C ++编写的,而不是你运行PHP for()循环。

我不认为你有很多选择,虽然Ilya Bursov的回答也很好。那个循环只经历了10次。

答案 2 :(得分:1)

从第一个数组中删除不需要的元素非常简单:

$sizeArray = array_intersect_key($sizeArray, $products);

传递给函数的数组的顺序很重要。请参阅php.net here上的array_intersect_keys条目。

我会在一个答案中添加一个问题:我不确定在你的情况下这样做是否会真正帮助你减少开销,除非你反复使用第一个数组,在这种情况下,你可能需要保留所有数据。也许你需要更多的解释?