Comments (2)
Short version:
Use ToList instead of ToArray. Or just iterate with foreach.
Long version:
There're a couple of gotchas caused by presence of keys in PHP's iterators and the library trying to not lose any data, including keys.
Let's make keys in your arrays explicit:
$local_types = [0 => "MOBILE", 1 => "OFFICE", 2 => "WHATSAPP", 3 => "PRIVATE", 4 => "WORK", 5 => "MAIN"];
$remote_types = [0 => "MOBILE", 1 => "RADIO", 2 => "WHATSAPP", 3 => "OFFICE"];
Union method uses KeySelector argument to join arrays, by default it selects values. So the sequence produced is this (just for illustration purposes):
[0 => "MOBILE", 1 => "OFFICE", 2 => "WHATSAPP", 3 => "PRIVATE", 4 => "WORK", 5 => "MAIN", 1 => "RADIO"];
Note that there're two elements with the key "1". ToArray method creates an array, iterates over an iterator and puts key-value pairs into array as is. This causes "OFFICE" value to disappear. What you need is ToList method, which works just like ToArray, but discards keys from original iterators and generates sequental integer keys instead. So the produced array will be:
[0 => "MOBILE", 1 => "OFFICE", 2 => "WHATSAPP", 3 => "PRIVATE", 4 => "WORK", 5 => "MAIN", 6 => "RADIO"];
You also can avoid all these problems if you just use iterators without converting them to arrays. For example, if you iterate over an iterator with foreach, you'll get all items and avoid allocating unnecessary memory blocks.
foreach (Enumerable::from($local_types)->union($remote_types) as $type)
echo($type);
Any "collapsing" methods like Max or ToString will work correctly too.
Iterators are less restricted than arrays: they can contain duplicate keys, objects in keys etc. If your transformation produces iterators like these, ToArray method may produce unexpected results.
By the way, documentation of ToArray includes this paragraph:
Keys from the sequence are preserved. If the source sequence contains multiple values with the same key, the result array will only contain the latter value. To discard keys, you can use {@link toList} method. To preserve all values and keys, you can use {@link toLookup} method.
Though the fact that Union method preserves keys of both sequences isn't that obvious I guess.
from yalinqo.
Thanks a lot for the well explained answer, I'll try the code.
from yalinqo.
Related Issues (20)
- Library should throw own exception types HOT 1
- Distinct exception cases should have distinct exception types HOT 2
- Add reverse()
- how to 'sum my data' HOT 1
- Remove autoload files
- Array of arrays - firstOrDefault by reference? HOT 2
- Distinct returns incorrect indexes HOT 1
- Iterating through two arrays of objects with same ids HOT 6
- Replace Functions::compareStrict and compareLoose with spaceship operator
- Two conditions within where clause HOT 2
- Examples? HOT 4
- ReadMe: update syntax, sensible intro for newbies, FAQ
- Enumerable::getIterator fails silently HOT 2
- not PHP8 compatible -> obsolete function create_function HOT 1
- Abandoned? HOT 1
- how to add them to my project if I have no composer? HOT 1
- Custom comparer in orderBy is ignored if key selector is cached
- Update please, PHP 8.2+ HOT 1
- Can't install 2.5.0 together with PHPUnit 9.x
- Return type of YaLinqo\Enumerable::getIterator() should either be compatible HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from yalinqo.