4

I have following array. parentId key important!

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Home
            [parentId] => 
            [children] => 
        )

    [1] => Array
        (
            [id] => 2
            [name] => About
            [parentId] => 
            [children] => 
        )

    [2] => Array
        (
            [id] => 3
            [name] => Services
            [parentId] => 2
            [children] => 
        )

)

And below is my expected array result. You'll see the Services is is under the About that have id is 2 and services parentId is 2

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Home
            [parentId] => 
            [children] => 
        )

    [1] => Array
        (
            [id] => 2
            [name] => About
            [parentId] => 
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => Services
                            [parentId] => 2
                            [children] => 
                        )

                )

        )

)

I can do this with array_walk or array_map and foreach easily.

I just wonder that is there any function that join array indexes like SQL JOIN without foreach loop?

So in my array: id = parentId

6
  • Perhaps using array_merge_recursive using a user-defined callback? Commented Sep 20, 2013 at 11:48
  • @EliasVanOotegem that would be the same as with array_map, I think Commented Sep 20, 2013 at 11:49
  • @AlmaDoMundo: Not quite, since it's not recursive... but you'll have t use array_map($array, 'array_merge_recursive', $someParam) Commented Sep 20, 2013 at 11:51
  • @EliasVanOotegem I mean that you'll iterate through array with that in PHP (while OP want to avoid that). Well, almost every array function iterates through input array (simply in it's C-implementation - i.e. it's hided from user) - so I'm not sure why it's so important for OP. Commented Sep 20, 2013 at 11:54
  • @AlmaDoMundo: Well, if OP doesn't want to loop, he shouldn't be programming :-P I've seen another question like this, basically: loops are inevitable... (that comment is meant for the OP, obviously) Commented Sep 20, 2013 at 11:56

2 Answers 2

1

try this library

https://github.com/erdalceylan/array-join

DATA

$users = [
    ["id"=>1, "nick"=>"erdal"],
     (object)["id"=>2, "nick"=>"furkan" ],
    ["id"=>3, "nick"=>"huseyin"],
    ["id"=>4, "nick"=>"hümeyra" ],
    ["id"=>5, "nick"=>"tuba" ],
];

 $items = [
     ["user_id"=>1, "item"=>"kaban", "mmx" => "mmx1"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx2"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx3"],
     (object)["user_id"=>1, "item"=>"çorap", "mmx" => "mmx4"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx5"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx6"],
    ["user_id"=>2, "item"=>"araba", "mmx" => "mmx7"],
     (object)["user_id"=>9, "item"=>"ev", "mmx" => "mmx8"],
    ["user_id"=>10, "item"=>"yat", "mmx" => "mmx9"],
];

$foods = [
    ["user_id"=>1, "food"=>"iskender"],
    ["user_id"=>2, "food"=>"adana"],
];

$texts = [
    ["user_id"=>1, "text"=>"merhaba"],
    ["user_id"=>15, "text"=>" hi"],
];

USAGE

$instance = \ArrayJoin\Builder::newInstance()
    ->select("a.id", "a.nick", "b.item", "d.food")
    ->from($users, "a")
    ->innerJoin($items, "b", new \ArrayJoin\On("a.id = b.user_id"))
    ->leftJoin($texts, "c", new \ArrayJoin\On("a.id = c.user_id"))
    ->rightJoin($foods, "d", new \ArrayJoin\On("b.user_id = d.user_id"))
     ->where("a.id", "a.text", function ($fieldFirs, $fieldSecond){
         return $fieldFirs < 10;
     })
     ->limit(2)
     ->offset(1)
     ->setFetchType(\ArrayJoin\Builder::FETCH_TYPE_OBJECT);

 $instance->execute();

OUTPUT

 array (
   stdClass::__set_state(array(
      'id' => 1,
      'nick' => 'erdal',
      'item' => 'çorap',
      'food' => 'iskender',
   )),
   stdClass::__set_state(array(
      'id' => 1,
      'nick' => 'erdal',
      'item' => 'çorap',
      'food' => 'iskender',
   )),
 )
Sign up to request clarification or add additional context in comments.

3 Comments

Hey this is fantastic.I can confirm it works perfectly on Laravel 5.2.
Can I ask that you please review How to offer personal open-source libraries? and make sure you make it clear this is your own project?
You can use a runtime php sql library. github.com/whizsid/arraybase
0

array the array like how it's done in images.

    [1][children][0] => Array
                    (
                        [id] => 3
                        [name] => Services
                        [parentId] => 2
                        [children] => 
                    )

I personally would do it with two tables, then use one to reference the other based upon the key.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.