Code Monkey home page Code Monkey logo

Comments (2)

Athari avatar Athari commented on August 25, 2024 1

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.

ericgcc avatar ericgcc commented on August 25, 2024

Thanks a lot for the well explained answer, I'll try the code.

from yalinqo.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.