WireArray
The base collection class for all ProcessWire iterable sets
Nearly every collection
you encounter — pages, fields, templates, modules, roles, and more — is a Wire
subclass. Its API is jQuery-inspired: most mutation methods return $this for fluent
chaining, and both foreach and array access work out of the box.
Wire is not itself an API variable. You encounter it through the collections
returned by the API: $page->children(), $pages->find(), $modules, and many
more — all of these are Wire subclasses.
Expand all Collapse all API reference
// Append to end — all three are equivalent
$items->add($item);
$items->append($item);
$items[] = $item; // array access
// Prepend to beginning
$items->prepend($item);
// Insert relative to an existing item
$items->insertBefore($newItem, $existingItem);
$items->insertAfter($newItem, $existingItem);
// Import multiple items (array or WireArray)
$items->import($otherArray);
// Swap two items, or replace one with the other
$items->replace($itemA, $itemB); get($key)
The primary retrieval method. Accepts many forms:
// By array key
$item = $items->get('template-name'); // by name key
$item = $items->get(1234); // by numeric key
// By numeric position (0-based), negative counts from end
$item = $items->eq(0); // first item
$item = $items->eq(-1); // last item
// First and last
$first = $items->first();
$last = $items->last();
// First item matching a selector
$item = $items->get("name=foo-bar");
// Pipe fallback — returns first item found by key/name
$module = $modules->get("MarkupPageArray|MarkupAdminDataTable");
// Get an array of values from each item via "property[]" syntax
$titles = $items->get("title[]"); // returns plain PHP array
// Populate a template string with item properties
$html = $items->get("Total: {count}, First: {first}");
// Get multiple items by passing an array of keys
$subset = $items->get([1, 2, 3]); // returns associative arraygetArray(), getValues(), getKeys()
$assoc = $items->getArray(); // PHP array, original keys preserved
$values = $items->getValues(); // PHP array, re-indexed from 0
$keys = $items->getKeys(); // PHP array of keys onlyslice($start, $limit) and eq($n)
$first3 = $items->slice(0, 3); // returns new WireArray
$last3 = $items->slice(-3);
$third = $items->eq(2); // returns single item (0-based)
$last = $items->eq(-1); // last item Random selection
$one = $items->getRandom(); // single random item
$three = $items->getRandom(3); // new WireArray of 3 random items
$three = $items->findRandom(3); // always returns WireArray
// Seeded random — same result for the same day (useful for rotating featured items)
$three = $items->findRandomTimed(3); // daily seed (default)
$three = $items->findRandomTimed(3, 'YmdH'); // hourly seed
$three = $items->findRandomTimed(3, 42); // fixed integer seed // Count — both forms work
$n = $items->count();
$n = count($items);
$n = $items->count; // property
// Check if item, key, or selector matches anything
if($items->has($item)) { /* item object is present */ }
if($items->has('foo-bar')) { /* item with name 'foo-bar' is present */ }
if($items->has("status>0")) { /* at least one item matches selector */ }
// Check identity
if($items->isIdentical($other)) { /* same items, order, and data */ }
if($items->isIdentical($other, false)) { /* same items and order only */ }These return a new Wire and leave the original unchanged.
// All items matching a selector
$matches = $items->find("featured=1");
// First item matching a selector (returns item or false)
$match = $items->findOne("name=foo");
$match = $items->findOne("status>0, sort=-created");
// Reversed copy
$reversed = $items->reverse();
// Unique items only
$unique = $items->unique();
// Get adjacent items
$next = $items->getNext($item);
$prev = $items->getPrev($item);
// Divide into N equal slices (returns PHP array of WireArray objects)
$slices = $items->slices(3); These modify the Wirefind() instead if you need a copy.
// Keep only items matching a selector
$items->filter("featured=1");
// Remove items matching a selector
$items->not("status=0");
// Sort by one or more properties (CSV or array)
$items->sort("last_name, first_name");
$items->sort("-created"); // descending
$items->sort("sort, title"); // by multiple fields
// Randomise order in place
$items->shuffle();Sort supports dot-notation for sub-properties (sort("parent.title")), and the
special value "random" as an alias for shuffle().
// Remove by item object, key, or selector
$items->remove($item);
$items->remove('foo-bar'); // by name key
$items->remove("status=0"); // by selector 3.0.196+
// Remove multiple
$items->removeItems([$itemA, $itemB]);
// Remove all
$items->removeAll();
// Pop/shift (remove and return)
$last = $items->pop(); // removes and returns last item
$first = $items->shift(); // removes and returns first itemforeach
foreach($items as $item) {
echo $item->title;
}
foreach($items as $key => $item) {
echo "$key: $item->title\n";
}each()
The most versatile iteration method. Accepts a callable, a template string, a property name, or an array of property names.
// Callable — return strings to build a concatenated result
echo $items->each(function($item) {
return "<li>$item->title</li>";
});
// With key as first argument when function has 2 parameters
echo $items->each(function($key, $item) {
return "<li>$key: $item->title</li>";
});
// Template string with {tags}
echo $items->each("<li><a href='{url}'>{title}</a></li>");
// Property name — returns PHP array of values
$titles = $items->each("title");
// Multiple properties — returns array of associative arrays
$data = $items->each(["title", "url"]);implode() — build a delimited string
// Comma-separated list of titles
echo $items->implode(", ", "title");
// Template string with {tags}
echo $items->implode(' / ', '<a href="{url}">{title}</a>');
// Custom function per item
echo $items->implode(", ", function($item) {
return "$item->title ($item->id)";
});
// With options
echo $items->implode(", ", "title", ['skipEmpty' => true, 'prepend' => 'Items: ']);explode() — extract a property as a PHP array
$titles = $items->explode("title"); // ['Title A', 'Title B', ...]
// Multiple properties: [['title' => 'Title A', 'url' => '/foo/'], ...]
$data = $items->explode(["title", "url"]);
// With a custom key: [ 'foo-bar' => 'Foo Bar', ...]
$byName = $items->explode("title", ['key' => 'name']); // keyed by 'name' propertyMagic property dispatch
Calling an unknown method on a Wire automatically delegates to explode()
or implode() for a property having the name you specified as a method:
// same as $items->explode('title'): [ 'Foo', 'Bar', 'Baz', ...]
$titles = $items->title();
// same as $items->implode(", ", "title"): "Foo, Bar, Baz"
$str = $items->title(", ");Wire carries a separate $extraData store (not the items themselves) for
arbitrary metadata you want to attach to the collection — similar to jQuery's
.data():
// Set
$items->data('totalCount', 500);
$items->data(['page' => 2, 'limit' => 10]);
// Get
$total = $items->data('totalCount');
$all = $items->data();
// Remove
$items->removeData('totalCount');
$items->data(false, 'totalCount'); // alternative unset form
// Replace all extra data
$items->data(['page' => 3], true);// Global shortcut function — most concise form
$a = WireArray(); // empty
$a = WireArray('foo'); // one item
$a = WireArray(['foo', 'bar']); // from PHP array
// Static factory — works on any WireArray subclass (PHP 7+)
$a = WireArray::new(); // empty
$a = WireArray::new($item); // one item
$a = WireArray::new([$a, $b]); // from PHP array
$a = WireArray::new($otherWireArray);
// Blank instance of the same concrete type (useful in subclasses)
$copy = $items->makeNew();
// Full clone (same type, same items)
$copy = clone $items;
$copy = $items->makeCopy(); // equivalent WireData() and PageArray() are analogous shortcut functions for those types
(also in wire/core/Functions.php).
Wire tracks which items were added or removed while change tracking is on,
in addition to the property-level change tracking inherited from Wire.
$items->setTrackChanges(true);
$items->add($newItem);
$items->remove($oldItem);
$added = $items->getItemsAdded(); // array of added items
$removed = $items->getItemsRemoved(); // array of removed items
$items->resetTrackChanges(); // clears added/removed lists and disables tracking- Source file:
wire/core/WireArray/Wire Array.php - Extends:
Wire— all hook and API-variable access fromWireis available - Implements:
IteratorAggregate,ArrayAccess,Countable - Common subclasses:
PageArray,Modules,Fieldtypes, and many module-defined collection types. Note thatFields,Templates,Fieldgroups,Roles,Users, andPermissionsare iterableWireobjects but extendWireSaveableItemsorPagesType, notWiredirectly.Array - Destructive vs non-destructive:
filter(),not(), andsort()modify the collection in place;find(),findOne(),reverse(),unique(), andslice()return new collections - Duplicate checking: subclasses that use named keys prevent duplicate items automatically; plain
Wireinstances do not, unless you callArray setDuplicateChecking(true). get()vs array access:get($key)returnsnullfor missing items; array access$items[$key]returnsfalseeach()return value: returns$thiswhen the callback returns nothing (for chaining), or a concatenated string when callbacks return stringssort()special values: prepend hyphen (-) to any property name for descending order ("-created"); use"random"as the sole property to shuffle- String representation: casting a
Wireto string returns its items joined byArray |(using each item's own__toString())
API reference: methods, properties, hooks
Nearly all collections of items in ProcessWire are derived from the Wire
Below are all the public methods you can use to interact with Wireforeach() them and get or set elements using array syntax, i.e. $value = $items[$key]; to get an item or $items[] = $item; to add an item.
Click any linked item for full usage details and examples. Hookable methods are indicated with the icon. In addition to those shown below, the Wire class also inherits all the methods and properties of: Wire.
- Traversal
- Retrieval
- Manipulation
- Info
- Output rendering
- Other data storage
- Changes
- Fun tools
- Common
- Properties
Traversal
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | Wire | Return a new copy of this Wire | |
Wire Wire Wire | array null string Wire | Perform an action upon each item in the Wire | |
Wire Wire Wire | Wire mixed bool | Returns the first item in the Wire Can also be used as property: Wire | |
Wire Wire Wire | ArrayObject Wire | Allows iteration of the Wire | |
Wire Wire Wire | Wire mixed bool | Returns the last item in the Wire Can also be used as property: Wire | |
Wire Wire Wire | array | Divide this Wire |
Retrieval
Manipulation
Info
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | bool | Does this Wire | |
Wire Wire Wire | bool | Is the given Wire | |
Wire Wire Wire | bool | Is the given item valid for storage in this array? | |
Wire Wire Wire | bool | Is the given item key valid for use in this array? | |
Wire Wire Wire | bool | Determines if the given item iterable as an array. |
Output rendering
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | array null string Wire | Perform an action upon each item in the Wire | |
Wire Wire Wire | string | Combine all elements into a delimiter-separated string containing the given property from each item |
Other data storage
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | Wire mixed array null | Store or retrieve an extra data value in this Wire | |
Wire Wire Wire | $this | Remove a property/value previously set with the Wire |
Changes
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | array Wire | Return array of all items added to this Wire | |
Wire Wire Wire | array Wire | Return array of all items removed from this Wire |
Fun tools
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | Wire | Return a new copy of this Wire | |
Wire Wire Wire | null mixed | Handler for when an unknown/unhooked method call is executed | |
Wire Wire Wire | array null string Wire | Perform an action upon each item in the Wire | |
Wire Wire Wire | array | Return a plain array of the requested property from each item | |
Wire Wire Wire | string | Combine all elements into a delimiter-separated string containing the given property from each item |
Common
| Name | Return | Summary | |
|---|---|---|---|
Wire Wire Wire | None | Set the current duplicate checking state |
Properties
| Name | Return | Summary | |
|---|---|---|---|
| Wire | array | All keys used in this Wire | |
| Wire | array | All values used in this Wire |
Additional methods and properties
In addition to the methods and properties above, Wire
API reference based on ProcessWire core version 3.0.269