PHP Функция массива для сравнения и объединения значений - PullRequest
0 голосов
/ 24 апреля 2020

Цените ваше время!

После просмотра нескольких тем 'Сравнить и объединить', наконец, я собираюсь попросить кого-нибудь помочь с этим очень конкретным c сценарием.

$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,
    ),
  ),
);

Это перечень товаров (перечисленных по идентификатору продукта и идентификатору модели) по идентификатору магазина. Я хочу объединить значения идентификатора модели, ГДЕ идентификатор продукта совпадает с массивом с идентификатором магазина, начинающимся с 'tmp-'. Если идентификатор продукта не совпадает, то я хочу, чтобы этот массив оставался как есть. Надеюсь, у меня есть смысл.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 24 апреля 2020

Ниже приведен фрагмент кода, позволяющий решить конкретную проблему c, заданную вашим примером:

$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[] = $temporaryProductId;
                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);

Этот фрагмент может работать для вас или нет. В любом случае, я настоятельно рекомендую вам реорганизовать этот код в более объектно-ориентированный дизайн. Где становится очевидным, что представляет каждое значение / структура, и проверка может происходить изолированно.

Теперь вам остается иметь дело с несовместимыми структурами массивов, которые визуально выглядят как непонятный беспорядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...