{"id":183151,"date":"2021-02-19T17:00:15","date_gmt":"2021-02-19T14:00:15","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/"},"modified":"2021-02-19T17:00:15","modified_gmt":"2021-02-19T14:00:15","slug":"how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/","title":{"rendered":"#How to Write Your Own Iterable Objects in PHP \u2013 CloudSavvy IT"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a25d9a223d8a\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a25d9a223d8a\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#Simple_Iteration\" >Simple Iteration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#The_Collection_Problem\" >The Collection Problem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#Implementing_Iterator\" >Implementing Iterator<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#IteratorAggregate\" >IteratorAggregate<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#Using_Prebuilt_PHP_Iterators\" >Using Prebuilt PHP Iterators<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#LimitIterator\" >LimitIterator<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#InfiniteIterator\" >InfiniteIterator<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#FilterIterator\" >FilterIterator<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#The_%E2%80%9Citerable%E2%80%9D_type\" >The \u201citerable\u201d type<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-write-your-own-iterable-objects-in-php-cloudsavvy-it\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<p><strong>&#8220;#How to Write Your Own Iterable Objects in PHP \u2013 CloudSavvy IT&#8221;<\/strong><\/p>\n<div id=\"article-content-area\">\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4047\" src=\"https:\/\/www.cloudsavvyit.com\/thumbcache\/0\/0\/b835749967babe94be45e3edd2508d9c\/p\/uploads\/2017\/08\/1ac500da.png\" alt=\"PHP Logo\" width=\"1400\" height=\"600\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>PHP allows you to create iterable objects. These can be used within loops instead of scalar arrays. Iterables are commonly used as object collections. They allow you to typehint that object while retaining support for looping.<\/p>\n<h2 id=\"simple-iteration\"><span class=\"ez-toc-section\" id=\"Simple_Iteration\"><\/span>Simple Iteration<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>To iterate over an array in PHP, you use a <code>foreach<\/code> loop:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"br0\">[<\/span><span class=\"st0\">\"1\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"2\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"3\"<\/span><span class=\"br0\">]<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$i<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$i<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">\" \"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This example would emit <code>1 2 3<\/code>.<\/p>\n<p>You can also iterate over an object:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"re0\">$cls<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> StdClass<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"re0\">$cls<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">foo<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">\"bar\"<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$cls<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$i<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"re0\">$i<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This example would emit <code>bar<\/code>.<\/p>\n<h2 id=\"the-collection-problem\"><span class=\"ez-toc-section\" id=\"The_Collection_Problem\"><\/span>The Collection Problem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>For basic classes with public properties, a plain <code>foreach<\/code> works well. Let\u2019s now consider another class:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">class<\/span> UserCollection <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$items<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">[<\/span><span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> add<span class=\"br0\">(<\/span>UserDomain <span class=\"re0\">$user<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> void <span class=\"br0\">{<\/span>\n        <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">items<\/span><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> containsAnAdmin<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> bool <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"br0\">(<\/span><span class=\"kw3\">count<\/span><span class=\"br0\">(<\/span><span class=\"kw3\">array_filter<\/span><span class=\"br0\">(<\/span>\n            <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">items<\/span><span class=\"sy0\">,<\/span>\n            fn <span class=\"br0\">(<\/span>UserDomain <span class=\"re0\">$i<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> bool <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$i<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">isAdmin<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>\n        <span class=\"br0\">)<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This class represents a collection of <code>UserDomain<\/code> instances. As PHP doesn\u2019t support typed arrays, classes like this are necessary when you want to typehint an array which can only hold one type of value. Collections also help you create utility methods, like <code>containsWithAdmin<\/code>, that facilitate natural interaction with array items.<\/p>\n<p>Unfortunately, trying to iterate over this collection won\u2019t give the desired results. Ideally, iterating should operate on the <code>$items<\/code> array, not the class itself.<\/p>\n<h2 id=\"implementing-iterator-\"><span class=\"ez-toc-section\" id=\"Implementing_Iterator\"><\/span>Implementing Iterator<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Natural iteration can be added using the <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.iterator.php\"><code>Iterator<\/code> interface<\/a>. By implementing <code>Iterator<\/code>, you can define PHP\u2019s behaviour when instances of your class are used with <code>foreach<\/code>.<\/p>\n<p><code>Iterator<\/code> has five methods which you\u2019ll need to implement:<\/p>\n<ul>\n<li><strong><code>current() : mixed<\/code><\/strong> \u2013 Get the item at the current position in the iteration.<\/li>\n<li><strong><code>key() : scalar<\/code><\/strong> \u2013 Get the key at the current position in the iteration.<\/li>\n<li><strong><code>next() : void<\/code><\/strong> \u2013 Move to the next position in the iteration.<\/li>\n<li><strong><code>rewind() : void<\/code><\/strong> \u2013 Rewind the position to the start of the iteration.<\/li>\n<li><strong><code>valid() : bool<\/code><\/strong> \u2013 Get whether the current position has a value.<\/li>\n<\/ul>\n<p>These methods might be confusing at first. Implementing them is straightforward though \u2013 you\u2019re specifying what to do at each stage of a <code>foreach<\/code> execution.<\/p>\n<p>Each time your object is used with <code>foreach<\/code>, <code>rewind()<\/code> will be called. The <code>valid()<\/code> method is called next, informing PHP whether there\u2019s a value at the current position. If there is, <code>current()<\/code> and <code>key()<\/code> are called to get the value and key at that position. Finally, the <code>next()<\/code> method is called to advance the position pointer. The loop returns to calling <code>valid()<\/code> to see if there\u2019s another item available.<\/p>\n<p>Here\u2019s a typical implementation of <code>Iterator<\/code>:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">class<\/span> DemoIterator <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> int <span class=\"re0\">$position<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$items<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">[<\/span><span class=\"st0\">\"cloud\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"savvy\"<\/span><span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> <span class=\"kw3\">rewind<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> void <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"st0\">\"Rewinding\"<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">position<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> <span class=\"kw3\">current<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> string <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"st0\">\"Current\"<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">items<\/span><span class=\"br0\">[<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">position<\/span><span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> <span class=\"kw3\">key<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> int <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"st0\">\"Key\"<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">position<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> <span class=\"kw3\">next<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> void <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"st0\">\"Next\"<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"sy0\">++<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">position<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> valid<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> void <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">echo<\/span> <span class=\"st0\">\"Valid\"<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"kw3\">isset<\/span><span class=\"br0\">(<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">items<\/span><span class=\"br0\">[<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">position<\/span><span class=\"br0\">]<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Here\u2019s what would h<a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">app<\/a>en when iterating <code>DemoIterator<\/code>:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"re0\">$i<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> DemoIterator<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$i<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$key<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$value<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"st0\">\"<span class=\"es4\">$key<\/span> <span class=\"es4\">$value<\/span>\"<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"co1\">\/\/ EMITS:<\/span>\n<span class=\"co1\">\/\/ <\/span>\n<span class=\"co1\">\/\/ Rewind<\/span>\n<span class=\"co1\">\/\/ Valid Current Key<\/span>\n<span class=\"co1\">\/\/ 0 cloud<\/span>\n<span class=\"co1\">\/\/ Next<\/span>\n<span class=\"co1\">\/\/ <\/span>\n<span class=\"co1\">\/\/ Valid Current Key<\/span>\n<span class=\"co1\">\/\/ 1 savvy<\/span>\n<span class=\"co1\">\/\/ Next<\/span>\n<span class=\"co1\">\/\/ <\/span>\n<span class=\"co1\">\/\/ Valid<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Your iterator needs to maintain a record of the loop position, check whether there\u2019s an element at the current loop position (via <code>valid()<\/code>) and return the key and value at the current position.<\/p>\n<p>PHP won\u2019t try to access the key or value when the loop position is invalid. Returning <code>false<\/code> from <code>valid()<\/code> im<a href=\"https:\/\/buradabiliyorum.com\/en\/category\/social-mediaa\/\" data-internallinksmanager029f6b8e52c=\"1\" title=\"Social Media\" target=\"_blank\" rel=\"noopener\">media<\/a>tely terminates the <code>foreach<\/code> loop. Typically, this will be when you get to the end of the array.<\/p>\n<h2 id=\"iteratoraggregate\"><span class=\"ez-toc-section\" id=\"IteratorAggregate\"><\/span>IteratorAggregate<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Writing iterators quickly gets repetitive. Most follow the exact recipe shown above. <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.iteratoraggregate.php\"><code>IteratorAggregate<\/code><\/a> is an interface which helps you quickly create iterable objects.<\/p>\n<p>Implement the <code>getIterator()<\/code> method and return a <code>Traversable<\/code> (the base interface of <code>Iterator<\/code>). It will be used as the iterator when your object is used with <code>foreach<\/code>. This is usually the easiest way to add iteration to a collection class:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">class<\/span> UserCollection <span class=\"kw2\">implements<\/span> IteratorAggregate <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> <span class=\"kw3\">array<\/span> <span class=\"re0\">$items<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">[<\/span><span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> add<span class=\"br0\">(<\/span>UserDomain <span class=\"re0\">$User<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> void <span class=\"br0\">{<\/span>\n        <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">items<\/span><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> getIterator<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> Traversable <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"kw2\">new<\/span> ArrayIterator<span class=\"br0\">(<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">items<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"re0\">$users<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> UserCollection<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"re0\">$users<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">add<\/span><span class=\"br0\">(<\/span><span class=\"kw2\">new<\/span> UserDomain<span class=\"br0\">(<\/span><span class=\"st0\">\"James\"<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"re0\">$users<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">add<\/span><span class=\"br0\">(<\/span><span class=\"kw2\">new<\/span> UserDomain<span class=\"br0\">(<\/span><span class=\"st0\">\"Demo\"<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$users<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$user<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"re0\">$user<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">Name<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>When working with collections, three lines of code are usually all you need to setup iteration! An <code>ArrayIterator<\/code> is returned as the <code>Traversable<\/code>. This is a class which automatically creates an <code>Iterator<\/code> out of an array. You can now iterate over the logical values within your object, instead of the object\u2019s direct properties.<\/p>\n<h2 id=\"using-prebuilt-php-iterators\"><span class=\"ez-toc-section\" id=\"Using_Prebuilt_PHP_Iterators\"><\/span>Using Prebuilt PHP Iterators<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>You\u2019ll need to write your own iterators if you have complex logic. It\u2019s rarely necessary to start from scratch as PHP ships with <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/spl.iterators.php\">several advanced iterators<\/a> provided by SPL.<\/p>\n<p>The built-in classes include <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.directoryiterator.php\"><code>DirectoryIterator<\/code><\/a>, <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.filesystemiterator.php\"><code>FilesystemIterator<\/code><\/a>, <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.globiterator.php\"><code>GlobIterator<\/code><\/a> and various recursive iterators. Here\u2019s some of the most useful generic iterators.<\/p>\n<h3 id=\"limititerator\"><span class=\"ez-toc-section\" id=\"LimitIterator\"><\/span>LimitIterator<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.limititerator.php\"><code>LimitIterator<\/code><\/a> lets you iterate over a subset of an array. You don\u2019t need to splice the array first or manually keep track of position inside your <code>foreach<\/code>.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"re0\">$arr<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> ArrayIterator<span class=\"br0\">(<\/span><span class=\"br0\">[<\/span><span class=\"st0\">\"a\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"b\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"c\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"d\"<\/span><span class=\"br0\">]<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"kw2\">new<\/span> LimitIterator<span class=\"br0\">(<\/span><span class=\"re0\">$arr<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">)<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$val<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"re0\">$val<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This example would emit <code>a b<\/code>. Note that <code>LimitIterator<\/code> accepts another <code>Iterator<\/code>, not an array. The example uses <code>ArrayIterator<\/code>, the built-in class which constructs an <code>Iterator<\/code> from an array.<\/p>\n<h3 id=\"infiniteiterator\"><span class=\"ez-toc-section\" id=\"InfiniteIterator\"><\/span>InfiniteIterator<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.infiniteiterator.php\"><code>InfiniteIterator<\/code><\/a> never terminates the loop, so you\u2019ll need to <code>break<\/code> from it manually. Otherwise, the iterator automatically wraps back to the start of the array when it reaches the end.<\/p>\n<p>This iterator is particularly useful when working with time-based values. Here\u2019s an easy way of building a three-year calendar, which also uses the <code>LimitIterator<\/code> described above:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"re0\">$months<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">[<\/span>\n    <span class=\"st0\">\"Jan\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Feb\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Mar\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Apr\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"May\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Jun\"<\/span><span class=\"sy0\">,<\/span>\n    <span class=\"st0\">\"Jul\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Aug\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Sep\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Oct\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Nov\"<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"Dec\"<\/span>\n<span class=\"br0\">]<\/span><span class=\"sy0\">;<\/span>\n<span class=\"re0\">$infinite<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> InfiniteIterator<span class=\"br0\">(<\/span><span class=\"kw2\">new<\/span> ArrayIterator<span class=\"br0\">(<\/span><span class=\"re0\">$months<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"kw2\">new<\/span> LimitIterator<span class=\"br0\">(<\/span><span class=\"re0\">$infinite<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">36<\/span><span class=\"br0\">)<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$month<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"re0\">$month<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This emits three years\u2019 worth of months.<\/p>\n<h3 id=\"filteriterator\"><span class=\"ez-toc-section\" id=\"FilterIterator\"><\/span>FilterIterator<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.filteriterator.php\"><code>FilterIterator<\/code><\/a> is an abstract class which you must extend. Implement the <code>accept<\/code> method to filter out unwanted values which should be skipped during iteration.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">class<\/span> DemoFilterIterator <span class=\"kw2\">extends<\/span> FilterIterator <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n        parent<span class=\"sy0\">::<\/span>__construct<span class=\"br0\">(<\/span><span class=\"kw2\">new<\/span> ArrayIterator<span class=\"br0\">(<\/span><span class=\"br0\">[<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">6<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">]<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> accept<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">getInnerIterator<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"kw3\">current<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">5<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"re0\">$demo<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> DemoFilterIterator<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$demo<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$val<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">echo<\/span> <span class=\"re0\">$val<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This example would emit <code>1 4 3<\/code>.<\/p>\n<p>The array values which are higher than 5 are filtered out and do not appear in the <code>foreach<\/code>.<\/p>\n<h2 id=\"the-iterable-type\"><span class=\"ez-toc-section\" id=\"The_%E2%80%9Citerable%E2%80%9D_type\"><\/span>The \u201citerable\u201d type<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Sometimes you might write a generic function that uses a <code>foreach<\/code> loop but knows nothing about the values it\u2019ll be iterating over. One example is an abstract error handler which simply dumps the values it receives.<\/p>\n<p>You can typehint <code>iterable<\/code> in these scenarios. This is a pseudo-type which will accept either an <code>array<\/code> or any object implementing <code>Traversable<\/code>:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">function<\/span> handleBadValues<span class=\"br0\">(<\/span>iterable <span class=\"re0\">$values<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> void <span class=\"br0\">{<\/span>\n    <span class=\"kw1\">foreach<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$values<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$value<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n        <span class=\"kw3\">var_dump<\/span><span class=\"br0\">(<\/span><span class=\"re0\">$value<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>The <code>iterable<\/code> type is so vague that you should think carefully before using it. Nonetheless, it can be useful as a last-resort type if you need to guarantee an input value will work with <code>foreach<\/code>.<\/p>\n<h2 id=\"conclusion\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Making use of iterators helps you write clean code that\u2019s more modular. You can move methods that act on arrays of objects into dedicated collection classes. These can then be typehinted individually while remaining fully compatible with <code>foreach<\/code>.<\/p>\n<p>Most of the time, adding iteration support can be achieved by implementing <code>IteratorAggregate<\/code> and returning an <code>ArrayIterator<\/code> configured with the items in your collection. PHP\u2019s other iterator types, which tend to go unused by developers, can greatly simplify more specific loops. They offer complex logical behaviours without requiring manual pointer tracking in your <code>foreach<\/code> statement.\n<\/div>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.cloudsavvyit.com\/9737\/how-to-write-your-own-iterable-objects-in-php\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;#How to Write Your Own Iterable Objects in PHP \u2013 CloudSavvy IT&#8221; PHP allows you to create iterable objects. These can be used within loops instead of scalar arrays. Iterables are commonly used as object collections. They allow you to typehint that object while retaining support for looping. Simple Iteration To iterate over an array&#8230;<\/p>\n","protected":false},"author":1,"featured_media":183152,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/thumbcache\/0\/0\/b835749967babe94be45e3edd2508d9c\/p\/uploads\/2017\/08\/1ac500da.png","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-183151","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/183151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=183151"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/183151\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/183152"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=183151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=183151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=183151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}