{"tag":"array","articles":{"projects\/avris-bag-nicer-arrays-for-php":{"key":"projects\/avris-bag-nicer-arrays-for-php","type":"article","published":true,"meta":{"createdAt":"2017-12-25T21:04:49+01:00","publishedAt":"2017-12-25T21:02:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Bag","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-bag-nicer-arrays-for-php"},"content":{"en":{"slug":"avris-bag-nicer-arrays-for-php","title":"Avris Bag \u2022 Nicer arrays for PHP","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_small.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlElEQVRIiX2X268lRRXGf+tS1b3PPvtc5nKGmQGGmyiiTiQaSYhhJEEgBhWNFzQh+qAPGh\/8E3z3zQej8VmfjC+IiUYjkECiSLwAInKZGRgGMsycOefsc9vdVcuH3jMYNVa6ujvpunz1fbVqfS3X33B7RKkIQdQKUTF3aikEgYrgapgqyZ3ZbJ9aK0RABAKICMJQRAQRAYIrJSLmtV59EhURUBHMHROhaUZ4hBARlFqQAAFKKQjDwKo6ABWFWkmq9PMJEJm342p7EQBBVd6dXK68C1ELokbEu\/0MIamhteBXOghKUIkADUF0mIwQVB0Q+lIxBEUIUUx1zsawEGT4Nr\/mN8PdmM06RCBiWKCIovO+poqbkVTxEIVa5gQPjBCBhKBquCkmgonipkhUaq3UWoYB3IfV14qqXZVKRYhaCYLllRUuX1oHKoQgDlELqgIBZkoyI\/kVQAKoQJ2zJSCicxkMRTEzsiUWmgaiZ2d3l8adJjnZE7VWSunpSwFh2C+1AnD0yBr7W1OgDqRFoJrnoBTTQeJsiosmIjokDKSiVzepoGYDtZZQUVQMFWfcjFkdLbM+3UBDiRI0nlDPEIUQoe+7gSGBE9dfz1unzyISSICpIASQEIm5ZEoyxTVl+mAeMXYlVkB1YEcNUyO7ky2hGCKJJiduPLzI9s6U\/a7jyDVrzHZ3mG5uYSJkV2pU7vrk3bzywoss5YYghsgCVAdRVEEEkinZDQ9NSJrLhVADTBRVQ0Vxc1yN7BkXIZmTJJG04cCBZT73tS9wYHWF3\/\/8V7x+5nWsWST5EE2T5UXuuudunn\/8KVbaEVCIiAGMCipgJpgOrLkLTm6Q3qk15voCKKKGmiNiuDmqCTeb18SpBz7Ow9\/+Ei8983ce\/cHPSBRuPXqMqJWt7Smeja9+77s884vHuHZpiVnpqNETUQbpdB5dadhDOSmm4NKOqV1Bah3OoQDEEHHUEskcVSOZ06bMgjtf\/9bnue+hU0zXt3jsR4+SdcTqQsvNtxxje+MdNnb2uOc7XyGpUM+8wfuOrjHd3WGvn1FqT6kdaCW5YSa4K8mFlAyXhSVk1kOpBAx7BEUkoWKIJ7I6bUospMTDj9zLfQ+dAuCvTz5HomGyOGFxoWHr0i4nPvIhPvngXXjb8PT3f8LaoWU0OjY2g75PlBgAhVRUg5QddyElxbPgMppA7qGAhEIogoI4aMLUSebklDh58kY+\/cVPXE0Jm29POXjkMMdPrHHi9uu47o6bGB9aIiJ4\/ddPMB5lSl2kbXpyU0EqNTr6fkbUDjVQDcyN3DieBGeyDH0hQgYwMUSX4bgmFEfmB+Aj33zg6skMcP837uU\/S0Rw7ok\/MbvwDodvOMj+RqbbvsySdohVxIJaO2q\/j9CjJpgrKWe8aXCdTEiFIc+geCgJI4uTw8hqZJQ7Tl7P8eMH\/gvAv5daCq\/85o9svfQK7Vhplxc4fNu19BtjNs8LKjOEDiQTJSFShwhLjuWMNSN8sjKhFGDOkCF4OK0YLUqL0VThzo\/d8n\/BTC9s8MIvn2J28QKjBlDodnfYudjhMmNhuaF2ZTh7DFQSMpdL3bHcos0Iv+bAiL4PaoEaioaiGCmEhNGG0hTh1psO\/U8gu5s7\/OPJ5zj37Itk6Ri1dUgdFaKDum\/QKHmkRFJMYi5TQk2xlNHcIKmBPMI\/sNaws9cx2y\/M+koplVIrEoJExYpgIhxaXbgKYnu6y5mXznH6L69y7vnXaKJjwQuRCk4layU0wAJmQ66UFCQP3AQzQVNCcgvJIGfIDXiLP7j6Jtt7lem0Y3O7Mu2DrX3YmcFeB7NeKD38+Ic\/ZXd7l8vvbLJ9aZNcColCotJqZWQ94xQstZXZQoVJkEJobbAZUjrUA8uG1aDrDGNCt29om9hYX6CjRU7dfiiW2sTe3mCV3DIhTsUJSRScqpm+QoiCOiKKq5HcOXbkCBvr62QTGoVxhkmGw+Pg6Gph7ZAxHgtnz19murtLyR0rx47z+G\/\/wOnz+yy1lbW1Cftd8PQL28jiyoHQlBE1LCW8aRE1PDd4ylhqUDVy02KeSJ5xSzTNiIPLyzz82Qd49tnnWF0cE33htef\/yXIyVltlpYWDi8rqGJL2JOtZGffcenKBy+enXDi\/yWQELj2H77yXnb\/9Dr\/tM1+mWVyir9COJ3hqUHXEnOQJEUMY8o6EIKVCKUgNRma8fHGHxWMn8JQ4fmiZ1y7s0wvsm7LvwnZScjLaVKlW2Wsqna1w4L1wefoqaSQ03tOv77D4\/vvwgjHd2QVLzLa2ENkGdPBCMRjwwQsxB1ORWql7e1ALb559GSmBRuAEVgWthYWUmSRn4s5yk1hIgmthIcN0r+OjH1zijXWlXupZGsHk8pu85\/4P4+tnXmbWdahnaql4M4J3\/yEQwFNCVZEIog6TSwRaK9L3Vw1+7fZxMS6\/fZY2t7gIy4tLHFxawaOys7PJ6tKEP7\/ovHVmxNsbe5y+uMcoB43O+FT\/BnLo5tuilkI\/m1G7fdJ4goRQZntoaoZ0UHs8twCD5wa0BoogccVDD15cIxAqJoKr4AJKJZuhGvR9h1BYmzjLrXFpd7C5jcOdJ+BfJyEzM18yLlUAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-bag_small.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlElEQVRIiX2X268lRRXGf+tS1b3PPvtc5nKGmQGGmyiiTiQaSYhhJEEgBhWNFzQh+qAPGh\/8E3z3zQej8VmfjC+IiUYjkECiSLwAInKZGRgGMsycOefsc9vdVcuH3jMYNVa6ujvpunz1fbVqfS3X33B7RKkIQdQKUTF3aikEgYrgapgqyZ3ZbJ9aK0RABAKICMJQRAQRAYIrJSLmtV59EhURUBHMHROhaUZ4hBARlFqQAAFKKQjDwKo6ABWFWkmq9PMJEJm342p7EQBBVd6dXK68C1ELokbEu\/0MIamhteBXOghKUIkADUF0mIwQVB0Q+lIxBEUIUUx1zsawEGT4Nr\/mN8PdmM06RCBiWKCIovO+poqbkVTxEIVa5gQPjBCBhKBquCkmgonipkhUaq3UWoYB3IfV14qqXZVKRYhaCYLllRUuX1oHKoQgDlELqgIBZkoyI\/kVQAKoQJ2zJSCicxkMRTEzsiUWmgaiZ2d3l8adJjnZE7VWSunpSwFh2C+1AnD0yBr7W1OgDqRFoJrnoBTTQeJsiosmIjokDKSiVzepoGYDtZZQUVQMFWfcjFkdLbM+3UBDiRI0nlDPEIUQoe+7gSGBE9dfz1unzyISSICpIASQEIm5ZEoyxTVl+mAeMXYlVkB1YEcNUyO7ky2hGCKJJiduPLzI9s6U\/a7jyDVrzHZ3mG5uYSJkV2pU7vrk3bzywoss5YYghsgCVAdRVEEEkinZDQ9NSJrLhVADTBRVQ0Vxc1yN7BkXIZmTJJG04cCBZT73tS9wYHWF3\/\/8V7x+5nWsWST5EE2T5UXuuudunn\/8KVbaEVCIiAGMCipgJpgOrLkLTm6Q3qk15voCKKKGmiNiuDmqCTeb18SpBz7Ow9\/+Ei8983ce\/cHPSBRuPXqMqJWt7Smeja9+77s884vHuHZpiVnpqNETUQbpdB5dadhDOSmm4NKOqV1Bah3OoQDEEHHUEskcVSOZ06bMgjtf\/9bnue+hU0zXt3jsR4+SdcTqQsvNtxxje+MdNnb2uOc7XyGpUM+8wfuOrjHd3WGvn1FqT6kdaCW5YSa4K8mFlAyXhSVk1kOpBAx7BEUkoWKIJ7I6bUospMTDj9zLfQ+dAuCvTz5HomGyOGFxoWHr0i4nPvIhPvngXXjb8PT3f8LaoWU0OjY2g75PlBgAhVRUg5QddyElxbPgMppA7qGAhEIogoI4aMLUSebklDh58kY+\/cVPXE0Jm29POXjkMMdPrHHi9uu47o6bGB9aIiJ4\/ddPMB5lSl2kbXpyU0EqNTr6fkbUDjVQDcyN3DieBGeyDH0hQgYwMUSX4bgmFEfmB+Aj33zg6skMcP837uU\/S0Rw7ok\/MbvwDodvOMj+RqbbvsySdohVxIJaO2q\/j9CjJpgrKWe8aXCdTEiFIc+geCgJI4uTw8hqZJQ7Tl7P8eMH\/gvAv5daCq\/85o9svfQK7Vhplxc4fNu19BtjNs8LKjOEDiQTJSFShwhLjuWMNSN8sjKhFGDOkCF4OK0YLUqL0VThzo\/d8n\/BTC9s8MIvn2J28QKjBlDodnfYudjhMmNhuaF2ZTh7DFQSMpdL3bHcos0Iv+bAiL4PaoEaioaiGCmEhNGG0hTh1psO\/U8gu5s7\/OPJ5zj37Itk6Ri1dUgdFaKDum\/QKHmkRFJMYi5TQk2xlNHcIKmBPMI\/sNaws9cx2y\/M+koplVIrEoJExYpgIhxaXbgKYnu6y5mXznH6L69y7vnXaKJjwQuRCk4layU0wAJmQ66UFCQP3AQzQVNCcgvJIGfIDXiLP7j6Jtt7lem0Y3O7Mu2DrX3YmcFeB7NeKD38+Ic\/ZXd7l8vvbLJ9aZNcColCotJqZWQ94xQstZXZQoVJkEJobbAZUjrUA8uG1aDrDGNCt29om9hYX6CjRU7dfiiW2sTe3mCV3DIhTsUJSRScqpm+QoiCOiKKq5HcOXbkCBvr62QTGoVxhkmGw+Pg6Gph7ZAxHgtnz19murtLyR0rx47z+G\/\/wOnz+yy1lbW1Cftd8PQL28jiyoHQlBE1LCW8aRE1PDd4ylhqUDVy02KeSJ5xSzTNiIPLyzz82Qd49tnnWF0cE33htef\/yXIyVltlpYWDi8rqGJL2JOtZGffcenKBy+enXDi\/yWQELj2H77yXnb\/9Dr\/tM1+mWVyir9COJ3hqUHXEnOQJEUMY8o6EIKVCKUgNRma8fHGHxWMn8JQ4fmiZ1y7s0wvsm7LvwnZScjLaVKlW2Wsqna1w4L1wefoqaSQ03tOv77D4\/vvwgjHd2QVLzLa2ENkGdPBCMRjwwQsxB1ORWql7e1ALb559GSmBRuAEVgWthYWUmSRn4s5yk1hIgmthIcN0r+OjH1zijXWlXupZGsHk8pu85\/4P4+tnXmbWdahnaql4M4J3\/yEQwFNCVZEIog6TSwRaK9L3Vw1+7fZxMS6\/fZY2t7gIy4tLHFxawaOys7PJ6tKEP7\/ovHVmxNsbe5y+uMcoB43O+FT\/BnLo5tuilkI\/m1G7fdJ4goRQZntoaoZ0UHs8twCD5wa0BoogccVDD15cIxAqJoKr4AJKJZuhGvR9h1BYmzjLrXFpd7C5jcOdJ+BfJyEzM18yLlUAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require avris\/bag\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EBag\u003C\/h3\u003E\n\u003Cp\u003E\u003Cem\u003EBag\u003C\/em\u003E class represents a key-value store. It can be used both as an array and as an object, leading to a shorter and nicer code:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$array = [\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n    \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027lorem\u0027\u003C\/span\u003E =\u0026gt; [\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ipsum\u0027\u003C\/span\u003E =\u0026gt; [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dolor\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027sit\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027amet\u0027\u003C\/span\u003E]\n    ],\n];\n\n$bag = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Bag($array);\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all return \u0027bar\u0027\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]) ? $array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E] : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E));\nvar_dump($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\nvar_dump($bag(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all return null\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E]) ? $array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E] : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E));\nvar_dump($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E]);\nvar_dump($bag(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all return \u0027default\u0027\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E]) ? $array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E] : \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E));\nvar_dump($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E] ?: \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E);\nvar_dump($bag(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\n$array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027x\u0027\u003C\/span\u003E] =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027y\u0027\u003C\/span\u003E;\n$bag-\u0026gt;set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027x\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027y\u0027\u003C\/span\u003E);\n$bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027x\u0027\u003C\/span\u003E] = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027y\u0027\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(count($array));\nvar_dump($bag-\u0026gt;count());\nvar_dump(count($bag));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(count($array) === \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;isEmpty());\nvar_dump(count($bag) === \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E);\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(array_keys($array));\nvar_dump($bag-\u0026gt;keys());\nvar_dump(array_keys($bag));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]));\nvar_dump($bag-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E));\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eunset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\n$bag-\u0026gt;delete(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eunset\u003C\/span\u003E($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\n$array = [];\n$bag-\u0026gt;clear();\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EJust like with a simple array, you can also \u003Cstrong\u003Eiterate\u003C\/strong\u003E over a Bag and \u003Cstrong\u003Ejson_encode\u003C\/strong\u003E it.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAdditional features\u003C\/strong\u003E include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;getDeep($key, $default = null)\u003C\/code\u003E \u2013 gets a value from a nested tree, using dot-separated string as a key, for instance \u003Ccode\u003E$bag-\u0026gt;getDeep(\u0027lorem.ipsum.1\u0027)\u003C\/code\u003E will return \u2018sit\u2019;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;add(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, without overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;replace(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, with overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;appendToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and appends \u003Ccode\u003E$value\u003C\/code\u003E at its end;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;prependToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and prepends \u003Ccode\u003E$value\u003C\/code\u003E at its beginning;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;map(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with values mapped by the callback function;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;filter(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with only those values from the original Bag, for which the callback function returns true.\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;flatten()\u003C\/code\u003E \u2013 returns a new Bag, with keys flattened, for instance \u003Ccode\u003Elorem.ipsum\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ESet\u003C\/h3\u003E\n\u003Cp\u003ESet is a similar structure, but it doesn\u2019t care about the keys and it makes sure that all the values are unique. Sometimes it\u2019s helpful to instantiate it with a callback:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$set = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Set([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027post\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027get\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GET\u0027\u003C\/span\u003E], \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027strtoupper\u0027\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ internal values are: \u0027POST\u0027 and \u0027GET\u0027\u003C\/span\u003E\n\nvar_dump($set-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027post\u0027\u003C\/span\u003E)); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ true\u003C\/span\u003E\nvar_dump($set-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027POST\u0027\u003C\/span\u003E)); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ true\u003C\/span\u003E\nvar_dump($set-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DELETE\u0027\u003C\/span\u003E)); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ false\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EMethods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;add($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;addMultiple(array $values)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;has($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;delete($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;first()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;last()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;clear()\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EBagHelper\u003C\/h3\u003E\n\u003Cp\u003EThis class provides four static methods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::isArray($object)\u003C\/code\u003E \u2013 checks if \u003Ccode\u003E$object\u003C\/code\u003E is an array or array-like (\u003Ccode\u003E\\Traversable\u003C\/code\u003E);\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::toArray($object)\u003C\/code\u003E \u2013 converts \u003Ccode\u003E$object\u003C\/code\u003E to an array;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicGetter($object, $attr, $default = null)\u003C\/code\u003E \u2013 tries to get a value from object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027]\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;getKey()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;get(\u0027key\u0027)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003Eor fallbacks to \u003Ccode\u003E$default\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicSetter($object, $attr, $value)\u003C\/code\u003E \u2013 tries to set a value to object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027] = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;setKey($value)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;set($key, $value)\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ENested\u003C\/h3\u003E\n\u003Cp\u003EThis class provides two static methods for a nested access to arrays and objects:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::get($object, array $keys, $default = null)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::set(array \u0026amp;$array, array $keys, $value)\u003C\/code\u003E (only arrays are supported).\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EFor example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003ENested::get($container, [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027github\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027webhooks\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ecould return a value of:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$container-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027github\u0027\u003C\/span\u003E)-\u0026gt;getWebhooks()[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E];\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eunless any of the chain elements doesn\u2019t exist \u2013 then \u003Ccode\u003E$default\u003C\/code\u003E is returned.\u003C\/p\u003E\n\u003Cp\u003ESimilarly:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003ENested::set($array, [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027baz\u0027\u003C\/span\u003E], \u003Cspan class=\u0022hljs-number\u0022\u003E8\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eis in equivalent to:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E][\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E][\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027baz\u0027\u003C\/span\u003E] = \u003Cspan class=\u0022hljs-number\u0022\u003E8\u003C\/span\u003E;\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ebut it creates all the arrays on the way, if they don\u2019t exist yet.\u003C\/p\u003E\n\u003Ch3\u003EQueueBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal queue, but lets you enqueue and dequeue\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$queue = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E QueueBag();\n$queue-\u0026gt;enqueue(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027value\u0027\u003C\/span\u003E)\n$queue-\u0026gt;enqueue(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E)\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Elist\u003C\/span\u003E($key, $value) = $queue-\u0026gt;dequeue()\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EStackBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal stack, but lets you push and pop\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$stack = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E StackBag();\n$stack-\u0026gt;push(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027value\u0027\u003C\/span\u003E)\n$stack-\u0026gt;push(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E)\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Elist\u003C\/span\u003E($key, $value) = $stack-\u0026gt;pop()\n\u003C\/code\u003E\u003C\/pre\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["accessor","array","helper","php","queue","stack"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-bag_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_mini.png\u0022 alt=\u0022Avris Bag\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_mini.png\u0022 alt=\u0022Avris Bag\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require avris\/bag\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EBag\u003C\/h3\u003E\n\u003Cp\u003E\u003Cem\u003EBag\u003C\/em\u003E class represents a key-value store. It can be used both as an array and as an object, leading to a shorter and nicer code:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$array = [\n    \u0027foo\u0027 =\u0026gt; \u0027bar\u0027,\n    \u0027lorem\u0027 =\u0026gt; [\n        \u0027ipsum\u0027 =\u0026gt; [\u0027dolor\u0027, \u0027sit\u0027, \u0027amet\u0027]\n    ],\n];\n\n$bag = new Bag($array);\n\n\/\/ all return \u0027bar\u0027\nvar_dump(isset($array[\u0027foo\u0027]) ? $array[\u0027foo\u0027] : null);\nvar_dump($bag-\u0026gt;get(\u0027foo\u0027));\nvar_dump($bag[\u0027foo\u0027]);\nvar_dump($bag(\u0027foo\u0027));\n\n\/\/ all return null\nvar_dump(isset($array[\u0027nonexistent\u0027]) ? $array[\u0027nonexistent\u0027] : null);\nvar_dump($bag-\u0026gt;get(\u0027nonexistent\u0027));\nvar_dump($bag[\u0027nonexistent\u0027]);\nvar_dump($bag(\u0027nonexistent\u0027));\n\n\/\/ all return \u0027default\u0027\nvar_dump(isset($array[\u0027nonexistent\u0027]) ? $array[\u0027nonexistent\u0027] : \u0027default\u0027);\nvar_dump($bag-\u0026gt;get(\u0027nonexistent\u0027, \u0027default\u0027));\nvar_dump($bag[\u0027nonexistent\u0027] ?: \u0027default\u0027);\nvar_dump($bag(\u0027nonexistent\u0027, \u0027default\u0027));\n\n\/\/ all are equivalent\n$array[\u0027x\u0027] =\u0026gt; \u0027y\u0027;\n$bag-\u0026gt;set(\u0027x\u0027, \u0027y\u0027);\n$bag[\u0027x\u0027] = \u0027y\u0027;\n\n\/\/ all are equivalent\nvar_dump(count($array));\nvar_dump($bag-\u0026gt;count());\nvar_dump(count($bag));\n\n\/\/ all are equivalent\nvar_dump(count($array) === 0);\nvar_dump($bag-\u0026gt;isEmpty());\nvar_dump(count($bag) === 0);\n\n\/\/ all are equivalent\nvar_dump(array_keys($array));\nvar_dump($bag-\u0026gt;keys());\nvar_dump(array_keys($bag));\n\n\/\/ all are equivalent\nvar_dump(isset($array[\u0027foo\u0027]));\nvar_dump($bag-\u0026gt;has(\u0027foo\u0027));\nvar_dump(isset($bag[\u0027foo\u0027]));\n\n\/\/ all are equivalent\nunset($array[\u0027foo\u0027]);\n$bag-\u0026gt;delete(\u0027foo\u0027);\nunset($bag[\u0027foo\u0027]);\n\n\/\/ all are equivalent\n$array = [];\n$bag-\u0026gt;clear();\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EJust like with a simple array, you can also \u003Cstrong\u003Eiterate\u003C\/strong\u003E over a Bag and \u003Cstrong\u003Ejson_encode\u003C\/strong\u003E it.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAdditional features\u003C\/strong\u003E include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;getDeep($key, $default = null)\u003C\/code\u003E \u2013 gets a value from a nested tree, using dot-separated string as a key, for instance \u003Ccode\u003E$bag-\u0026gt;getDeep(\u0027lorem.ipsum.1\u0027)\u003C\/code\u003E will return \u2018sit\u2019;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;add(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, without overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;replace(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, with overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;appendToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and appends \u003Ccode\u003E$value\u003C\/code\u003E at its end;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;prependToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and prepends \u003Ccode\u003E$value\u003C\/code\u003E at its beginning;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;map(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with values mapped by the callback function;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;filter(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with only those values from the original Bag, for which the callback function returns true.\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;flatten()\u003C\/code\u003E \u2013 returns a new Bag, with keys flattened, for instance \u003Ccode\u003Elorem.ipsum\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ESet\u003C\/h3\u003E\n\u003Cp\u003ESet is a similar structure, but it doesn\u2019t care about the keys and it makes sure that all the values are unique. Sometimes it\u2019s helpful to instantiate it with a callback:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$set = new Set([\u0027post\u0027, \u0027get\u0027, \u0027GET\u0027], \u0027strtoupper\u0027);\n\/\/ internal values are: \u0027POST\u0027 and \u0027GET\u0027\n\nvar_dump($set-\u0026gt;has(\u0027post\u0027)); \/\/ true\nvar_dump($set-\u0026gt;has(\u0027POST\u0027)); \/\/ true\nvar_dump($set-\u0026gt;has(\u0027DELETE\u0027)); \/\/ false\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EMethods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;add($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;addMultiple(array $values)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;has($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;delete($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;first()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;last()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;clear()\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EBagHelper\u003C\/h3\u003E\n\u003Cp\u003EThis class provides four static methods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::isArray($object)\u003C\/code\u003E \u2013 checks if \u003Ccode\u003E$object\u003C\/code\u003E is an array or array-like (\u003Ccode\u003E\\Traversable\u003C\/code\u003E);\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::toArray($object)\u003C\/code\u003E \u2013 converts \u003Ccode\u003E$object\u003C\/code\u003E to an array;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicGetter($object, $attr, $default = null)\u003C\/code\u003E \u2013 tries to get a value from object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027]\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;getKey()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;get(\u0027key\u0027)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003Eor fallbacks to \u003Ccode\u003E$default\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicSetter($object, $attr, $value)\u003C\/code\u003E \u2013 tries to set a value to object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027] = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;setKey($value)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;set($key, $value)\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ENested\u003C\/h3\u003E\n\u003Cp\u003EThis class provides two static methods for a nested access to arrays and objects:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::get($object, array $keys, $default = null)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::set(array \u0026amp;$array, array $keys, $value)\u003C\/code\u003E (only arrays are supported).\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EFor example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003ENested::get($container, [\u0027github\u0027, \u0027webhooks\u0027, \u0027foo\u0027]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ecould return a value of:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$container-\u0026gt;get(\u0027github\u0027)-\u0026gt;getWebhooks()[\u0027foo\u0027];\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eunless any of the chain elements doesn\u2019t exist \u2013 then \u003Ccode\u003E$default\u003C\/code\u003E is returned.\u003C\/p\u003E\n\u003Cp\u003ESimilarly:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003ENested::set($array, [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], 8);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eis in equivalent to:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$array[\u0027foo\u0027][\u0027bar\u0027][\u0027baz\u0027] = 8;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ebut it creates all the arrays on the way, if they don\u2019t exist yet.\u003C\/p\u003E\n\u003Ch3\u003EQueueBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal queue, but lets you enqueue and dequeue\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$queue = new QueueBag();\n$queue-\u0026gt;enqueue(\u0027key\u0027, \u0027value\u0027)\n$queue-\u0026gt;enqueue(\u0027foo\u0027, \u0027bar\u0027)\nlist($key, $value) = $queue-\u0026gt;dequeue()\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EStackBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal stack, but lets you push and pop\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$stack = new StackBag();\n$stack-\u0026gt;push(\u0027key\u0027, \u0027value\u0027)\n$stack-\u0026gt;push(\u0027foo\u0027, \u0027bar\u0027)\nlist($key, $value) = $stack-\u0026gt;pop()\u003C\/code\u003E\u003C\/pre\u003E","words":782,"readTime":4,"lang":"en"}}}}}