用于比较和合并值的PHP数组函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于比较和合并值的PHP数组函数相关的知识,希望对你有一定的参考价值。

感谢您的时间!

在回顾了几个“比较并合并”线程之后,最后,我将请求某人在这种非常特殊的情况下提供帮助。

$input = array(
  [ 2616 ] => array(
    [ 9878767654 ] => array(
      [ 987987987 ] => 987987987, 
      [ 987987986 ] => 987987986,
    ),
  ), 
  [ 2618 ] => array(
    [ 9878767654 ] => array(
      [ 987987987 ] => 987987987,
    ),

  ), 
  [ 'tmp-9878767654' ] => array(
    [ 9878767654 ] => array(
      [ 987987985 ] => 987987985, 
      [ 987987987 ] => 987987987,
    ),

  ), 
  [ 'tmp-9878767655' ] => array(
    [ 9878767655 ] => array(
      [ 987987975 ] => 987987975,
    ),
  ),
);

$desired_output = array(
  [ 2616 ] => array(
    [ 9878767654 ] => array(
      [ 987987987 ] => 987987987, 
      [ 987987986 ] => 987987986,
      [ 987987985 ] => 987987985,
    ),
  ),
  [ 2618 ] => array(
    [ 9878767654 ] => array(
      [ 987987987 ] => 987987987, 
      [ 987987986 ] => 987987986,
      [ 987987985 ] => 987987985,
    ),
  ),
  [ 'tmp-9878767655' ] => array(
    [ 9878767655 ] => array(
      [ 987987975 ] => 987987975,
    ),
  ),
);

这是按商店ID列出的产品清单(按产品ID和型号ID列出)。我想要合并Model ID值,而产品ID与具有以'tmp-'开头的store-ID的数组相同。如果产品ID不匹配,那么我希望该数组保持原样。我希望我有道理。

请帮助。

答案

以下是解决您的示例所提出的特定问题的代码段:

$temporaryStores = [];
$prefix = 'tmp-';
$prefixLength = strlen($prefix);

// extract the temporary store structures
foreach ($input as $storeId => $store) {
    if (is_string($storeId) && strpos($storeId, $prefix) === 0) {
        $productId = (int) substr($storeId, $prefixLength);
        $temporaryStores[$productId] = $store;
        unset($input[$storeId]);
    }
}

// merge matching temporary store structures into the actual ones
$mergedProductIds = [];
foreach ($temporaryStores as $temporaryProductId => $temporaryModels) {
    $temporaryModels = reset($temporaryModels); // Incompatible array structure
    foreach ($input as $storeId => $store) {
        foreach ($store as $productId => $models) {
            if ($productId === $temporaryProductId) {
                $modelsIds = array_merge($temporaryModels, $models);
                $modelsIds = array_unique($modelsIds);
                $input[$storeId][$productId] = $modelsIds;
                $mergedProductIds[] = $mergedProductIds;
                unset($temporaryStores[$temporaryProductId]);
            }
        }
    }
}

// append leftover temporary store structures to the result
foreach ($temporaryStores as $temporaryProductId => $temporaryModels) {
    if (!in_array($temporaryProductId, $mergedProductIds, true)) {
        $input[$prefix . $temporaryProductId] = $temporaryModels;
    }
}

var_dump($input);

此代码段可能对您不起作用。无论哪种方式,我都强烈建议您将代码重构为使用面向对象的设计。每个值/结构代表什么的地方都很明显,可以单独进行验证。

现在您只需要处理看起来像一个无法理解的混乱的不兼容数组结构。

以上是关于用于比较和合并值的PHP数组函数的主要内容,如果未能解决你的问题,请参考以下文章

PHP数组函数

PHP合并数组的三种方法的分析与比较

php 通过array_merge()和array+array合并数组的区别和效率比较

php合并数组并保留键值的方法

如何运用PHP函数array

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用