3 votes

php enregistre la valeur dupliquée et l'ajoute dans un nouveau tableau (tableau multidimensionnel)

J'ai un tableau de données comme ceci

Array
(
    [0] => Array
        (
            [MACHINE] => A1
            [LOT] => B1077
            [slot] => 1
        )
    [1] => Array
        (
            [MACHINE] => A2
            [LOT] => B0229           
            [slot] => 2
        )
    [2] => Array
        (
            [MACHINE] => A2
            [LOT] => B0132
            [slot] => 2
        )
    [3] => Array
        (
            [MACHINE] => A2
            [LOT] => B3967
            [slot] => 2
        )               
    [4] => Array
        (
            [MACHINE] => A3
            [LOT] => B2644
            [slot] => 3
        )
)

dans le tableau, les valeurs "machine" et "slot" sont dupliquées. Je veux garder une seule valeur de "machine" et "slot" puis pousser la valeur "lot" de "machine" et "slot" dupliqués dans le tableau. Le résultat que je veux est le suivant :

Array
(
    [0] => Array
        (
            [MACHINE] => A1
            [LOT] => B1077
            [slot] => 1
        )
    [1] => Array
        (
            [MACHINE] => A2
            [LOT] => B0229           
            [slot] => 2
            [Duplicate] => B0132, B3967
        )   
    [2] => Array
        (
            [MACHINE] => A3
            [LOT] => B2644
            [slot] => 3
        )
)

J'ai essayé de supprimer la valeur de répétition, mais je n'ai aucune idée de la façon d'obtenir le résultat que je souhaite.

$temp = array();
foreach ($array as $v) {
    if (!isset($temp[$v['MACHINE']]))
        $temp[$v['MACHINE']] = $v;
}
$result = array_values($temp);
 echo '<pre>', print_r($result, true), '</pre>';

1voto

Nick Points 36758

Vous êtes sur la bonne voie avec votre code, vous devez juste

  • tenir compte de la slot lors de la création de la clé pour $temp ; et
  • ajouter un Duplicate lorsque vous en rencontrez un

Par exemple :

$temp = array();
foreach ($array as $v) {
    $key = $v['MACHINE'] . '#' . $v['slot'];
    if (!isset($temp[$key])) {
        $temp[$key] = $v;
    }
    else {
        $temp[$key]['Duplicate'][] = $v['LOT'];
    }
}
foreach ($temp as &$v) {
    if (isset($v['Duplicate'])) $v['Duplicate'] = implode(', ', $v['Duplicate']);
}
$result = array_values($temp);
print_r($result);

J'ai poussé les valeurs dupliquées dans un tableau, et ensuite j'ai utilisé implode dans une seconde boucle pour produire la chaîne séparée par des virgules dans la sortie souhaitée. Il se peut que vous trouviez qu'un tableau soit plus utile, auquel cas vous pouvez supprimer la deuxième boucle. Vous pouvez également effectuer la concaténation des chaînes de caractères à la volée dans la boucle, si vous remplacez

$temp[$key]['Duplicate'][] = $v['LOT'];

avec

$temp[$key]['Duplicate'] = isset($temp[$key]['Duplicate']) ? $temp[$key]['Duplicate'] . ',' . $v['LOT'] : $v['LOT'];

Sortie :

Array
(
    [0] => Array
        (
            [MACHINE] => A1
            [LOT] => B1077
            [slot] => 1
        )
    [1] => Array
        (
            [MACHINE] => A2
            [LOT] => B0229
            [slot] => 2
            [Duplicate] => B0132, B3967
        )
    [2] => Array
        (
            [MACHINE] => A3
            [LOT] => B2644
            [slot] => 3
        )
)

Démonstration sur 3v4l.org

1voto

shash678 Points 5168

Vous pourriez utiliser le fait que tableaux en PHP peut être utilisé comme Hashmaps que vous connaissez peut-être dans d'autres langages de programmation :

<?php

function condense_duplicates($arrays) {
  $machine_slot_map = array();

  foreach ($arrays as $arr) {
    $machine_slot_key = "{$arr['MACHINE']}_{$arr['slot']}";
    if (array_key_exists($machine_slot_key, $machine_slot_map)) {
      $lot = $arr['LOT'];
      if (array_key_exists('Duplicate', $machine_slot_map[$machine_slot_key])) {
        $curr_duplicates = $machine_slot_map[$machine_slot_key]['Duplicate'];
        $machine_slot_map[$machine_slot_key]['Duplicate'] = "{$curr_duplicates}, {$lot}";
      } else {
        $machine_slot_map[$machine_slot_key]['Duplicate'] = $lot;
      }
    } else {
      $machine_slot_map[$machine_slot_key] = $arr;
    }
  }

  return array_values($machine_slot_map);
}

$arrays = array (
  array('MACHINE' => 'A1',
        'LOT' => 'B1077',
        'slot' => 1),
  array('MACHINE' => 'A2',
        'LOT' => 'B0229',
        'slot' => 2),
  array('MACHINE' => 'A2',
        'LOT' => 'B0132',
        'slot' => 2),
  array('MACHINE' => 'A2',
        'LOT' => 'B3967',
        'slot' => 2),
  array('MACHINE' => 'A3',
        'LOT' => 'B2644',
        'slot' => 3)
);

// echo 'Before:', PHP_EOL;
// print_r($arrays);

$arrays_with_condensed_duplicates = condense_duplicates($arrays);

// echo 'After:', PHP_EOL;
print_r($arrays_with_condensed_duplicates);

Sortie :

Array
(
    [0] => Array
        (
            [MACHINE] => A1
            [LOT] => B1077
            [slot] => 1
        )

    [1] => Array
        (
            [MACHINE] => A2
            [LOT] => B0229
            [slot] => 2
            [Duplicate] => B0132, B3967
        )

    [2] => Array
        (
            [MACHINE] => A3
            [LOT] => B2644
            [slot] => 3
        )

)

Démonstration sur repl.it

Démonstration sur 3v4l.org

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X