Maison > Questions et réponses > le corps du texte
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粉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 ];