recherche

Maison  >  Questions et réponses  >  le corps du texte

PHP : comparez les tableaux de tableaux et créez un nouveau tableau lorsque les valeurs correspondent

Voici un exemple d'ensemble de données

$all_items = array (
  $a1 = array (
      name => "item1",
      description => "item 1",
      item_key => 123
  ),
  $a2 = array (
      name => "item2",
      description => "item 2",
      item_key => 456
  ),
  $a3 = array (
      name => "item3",
      description => "item 3",
      item_key => 789
  )
);

$invoice_items = array (
  $b1 = array (
      item_key => 123,
      desc => "1item"
  ),
  $b2 = array (
      item_key => 456,
      desc => "2item"
  ),
  $b3 = array (
      item_key => 123,
      desc => "3item"
  ),
  $b4 = array (
      item_key => 345,
      desc => "4item"
  ),
  $b5 = array (
      item_key => 123,
      desc => "5item"
  ),
  $b6 = array (
      item_key => 345,
      desc => "6item"
  ),
  $b7 = array (
      item_key => 123,
      desc => "7item"
  )
);

Le but ici est donc que chaque fois qu'un élément de facture correspond à celui d'un article item_key, je souhaite placer le tableau d'éléments de facture dans un nouveau tableau. Donc, dans cet exemple, je pense que le résultat que je veux ressemble à ceci

Array (
   [0] => Array (
      [0] => Array ( [name] => item1 [description] => item 1 [item_key] => 123 ),
      [1] => Array ( [item_key] => 123 [desc] => 1item ),
      [2] => Array ( [item_key] => 123 [desc] => 3item ),
      [3] => Array ( [item_key] => 123 [desc] => 5item ),
      [4] => Array ( [item_key] => 123 [desc] => 7item )
   )

   [1] => Array (
      [0] => Array ( [name] => item2 [description] => item 2 [item_key] => 456 ),
      [1] => Array ( [item_key] => 456 [desc] => 2item ),
   )

   [2] => Array (
      [0] => Array ( [name] => item3 [description] => item 3 [item_key] => 789 )
   )
)

Des suggestions ?

J'ai simplement essayé de comparer les tableaux et de pousser les valeurs, mais je me retrouve avec un grand tableau, un peu de retour à mon point de départ. Je suis encore un peu nouveau en PHP et je ne connais peut-être pas certaines méthodes de tableau

P粉323224129P粉323224129438 Il y a quelques jours563

répondre à tous(1)je répondrai

  • P粉211273535

    P粉2112735352023-09-20 12:51:34

    $all_items = [
      $a1 = [ 'name' => 'item1', 'description' => 'item 1', 'item_key' => 123 ],
      $a2 = [ 'name' => 'item2', 'description' => 'item 2', 'item_key' => 456 ],
      $a3 = [ 'name' => 'item3', 'description' => 'item 3', 'item_key' => 789 ]
    ];
    
    $invoice_items = [
      $b1 = [ 'item_key' => 123, 'desc' => '1item' ],
      $b2 = [ 'item_key' => 456, 'desc' => '2item' ],
      $b3 = [ 'item_key' => 123, 'desc' => '3item' ],
      $b4 = [ 'item_key' => 345, 'desc' => '4item' ],
      $b5 = [ 'item_key' => 123, 'desc' => '5item' ],
      $b6 = [ 'item_key' => 345, 'desc' => '6item' ],
      $b7 = [ 'item_key' => 123, 'desc' => '7item' ]
    ];
    
    $invoices = [];
    foreach ($invoice_items as $invoice_item) {
      $invoices[$invoice_item['item_key']][] = $invoice_item;
    }
    
    $result = [];
    foreach ($all_items as $all_item) {
      $result[] = array_merge([ $all_item ], $invoices[$all_item['item_key']] ?? []);
    }

    La structure du tableau résultant est la même que celle que vous avez décrite dans votre question ci-dessus.

    Mais il y a une contradiction entre votre ensemble de résultats et votre commentaire "... fusionner le tableau bill_item dans un nouveau tableau". Votre tableau de résultats contient les éléments de facture ajoutés, d'où mon code ci-dessus.

    Maintenant, cette solution crée une nouvelle clé - ici appelée "descs" - un tableau dans les éléments de facture sous cette clé :

    $invoices = [];
    foreach ($invoice_items as $invoice_item) {
      $invoices[$invoice_item['item_key']][] = $invoice_item;
    }
    
    foreach ($all_items as &$all_item) {
      $all_item['descs'] = $invoices[$all_item['item_key']] ?? [];
    }
    unset($all_item);

    Étant donné que les éléments item_key dans ces entrées du tableau "descs" sont redondants, vous pouvez les supprimer et simplement créer un tableau de chaînes :

    $invoices = [];
    foreach ($invoice_items as $invoice_item) {
      $invoices[$invoice_item['item_key']][] = $invoice_item['desc'];
    }
    
    foreach ($all_items as &$all_item) {
      $all_item['descs'] = $invoices[$all_item['item_key']] ?? [];
    }
    unset($all_item);

    Sortie :

    Array
    (
        [0] => Array
            (
                [name] => item1
                [description] => item 1
                [item_key] => 123
                [descs] => Array
                    (
                        [0] => 1item
                        [1] => 3item
                        [2] => 5item
                        [3] => 7item
                    )
    
            )
    
        [1] => Array
            (
                [name] => item2
                [description] => item 2
                [item_key] => 456
                [descs] => Array
                    (
                        [0] => 2item
                    )
    
            )
    
        [2] => Array
            (
                [name] => item3
                [description] => item 3
                [item_key] => 789
                [descs] => Array
                    (
                    )
    
            )
    
    )

    Veuillez noter que vos tableaux d'entrée ont tous des instructions d'affectation dans leur construction ($a1 = ..., $a2 = ..., etc.). Cela n'a pas beaucoup de sens, sauf si vous avez besoin de ces variables plus tard. Si c'est le cas, il est préférable de l'encoder de manière plus lisible :

    $a1 = [ 'name' => 'item1', 'description' => 'item 1', 'item_key' => 123 ],
    $a2 = [ 'name' => 'item2', 'description' => 'item 2', 'item_key' => 456 ],
    $a3 = [ 'name' => 'item3', 'description' => 'item 3', 'item_key' => 789 ]
    
    $all_items = [ $a1, $a2, $a3 ];

    répondre
    0
  • Annulerrépondre