-1

I am stuck in a array manipulation task.

Scenario:
I have an array of Objects. Sample:

Array(
    [0] => stdClass Object(
        ['foo'] => 'foo1',
        ['bar'] => 'bar1',
        ['baz'] => 'baz1'
        ),
    [1] => stdClass Object(
        ['foo'] => 'foo2',
        ['bar'] => 'bar2',
        ['baz'] => 'baz2'
        ),
    [2] => stdClass Object(
        ['foo'] => 'foo3',
        ['bar'] => 'bar3',
        ['baz'] => 'baz3'
        )
)

I have to convert it into this form:

Array(
    ['foo1'] => Array('bar1', 'baz1'),
    ['foo2'] => Array('bar2', 'baz2'),
    ['foo3'] => Array('bar3', 'baz3'),
)

Here is the function that i create to achieve this:

function createAttributeString($attributes)
{
    $finalString = '';
    $string = array();
    $column = array();

    foreach( $attributes as $attrib )
    {
        if( $attrib->primary_key == '1' )
            $column[$attrib->name] = array("'$attrib->type'", "'$attrib->max_length'", '\'pk\'');
        else
            $column[$attrib->name] = array("'$attrib->type'", "'$attrib->max_length'");

        $string[$attrib->name] = 'array('.implode(',', $column[$attrib->name]).')';
    }

    $finalString = 'array('.implode(',', $string).')';
    return $finalString;
}

But the output of this function is:

Array(
    [0] => Array('bar1', 'baz1'),
    [1] => Array('bar2', 'baz2')
    [2] => Array('bar3', 'baz3')
)

I know this is because of the last implode function that i have used in $finalString, but i dont understand what should i use instead to get my desired output.

Any help or suggestion would be highly appreciated.

UPDATE:
The final array should be return in a string format.

7
  • 1
    Are you trying to figure out how to rename the final array's element names from 0, 1, 2 to foo1, foo2, foo3? Commented Aug 8, 2012 at 15:48
  • 1
    If you're doing $attrib->primary_key then your $attributes isn't an array of arrays, but an array of objects, not quite what you've shown Commented Aug 8, 2012 at 15:52
  • you could loop through the array, then for each entry array_shift() the first element off and use it as the key, the content is then the array_values() of the remainder. Commented Aug 8, 2012 at 15:54
  • oh yeah thats my mistake its actually an object.... Commented Aug 8, 2012 at 15:54
  • Could you rewrite input data as object instead of array, so we see the structure? Also, do you need to get an array or convert it to plain string? Commented Aug 8, 2012 at 16:05

1 Answer 1

1

UPDATE 2

In addition to the code below I previously posted, you can use the following code to "pretty-print" your array in your desired form:

$s = "Array(" . "<br />";
foreach ($output as $key => $array) {
    $s .= "['" . $key . "'] => Array('";
    $s .= implode("', '", $array);
    $s .= "')," . "<br />";
}
$s .= ")";
print $s;

will output:

Array(
['foo1'] => Array('bar1', 'baz1'),
['foo2'] => Array('bar2', 'baz2'),
['foo3'] => Array('bar3', 'baz3'),
)

Hope it helps!


UPDATE

After you updated the question, and mentioned that the array is consisting of stdClass objects, I have updated the code that works with stdClass and then stores the output in a string variable which can be printed later:

<?php

// Basic setup of test variables
$arr = array(
    array("foo" => "foo1", "bar" => "bar1", "baz" => "baz1", "car" => "car1"), 
    array("foo" => "foo2", "bar" => "bar2", "baz" => "baz2", "car" => "car2"), 
    array("foo" => "foo3", "bar" => "bar3", "baz" => "baz3", "car" => "car3")
       );

// array of objects
$arrObject = array();

// convert above array to an array of stdClass objects
foreach ($arr as $array) {
    $object = new stdClass();
    foreach ($array as $key => $value) {
        $object->$key = $value;
    }
    $arrObject[] = $object;
}   

// print to see if the array structure is the right one
print "<pre>";
print_r($arrObject);
print "</pre>";

// now the real code starts, assuming $arrObject is the input array you specified in your question
$output = array();
foreach ($arrObject as $a) {
  $a = (array) $a;
  $key = key($a);
  next($a);
  $output[$a[$key]] = array();
  while (($key2 = key($a)) !== null) {
    next($a);
    $output[$a[$key]][] = $a[$key2];
  }
}

$str = print_r($output, true);
print "<pre>";
print $str;
print "</pre>";

The above code will print the following output on screen:

[input]
Array
(
    [0] => stdClass Object
        (
            [foo] => foo1
            [bar] => bar1
            [baz] => baz1
            [car] => car1
        )

    [1] => stdClass Object
        (
            [foo] => foo2
            [bar] => bar2
            [baz] => baz2
            [car] => car2
        )

    [2] => stdClass Object
        (
            [foo] => foo3
            [bar] => bar3
            [baz] => baz3
            [car] => car3
        )

)

[output]
Array
(
    [foo1] => Array
        (
            [0] => bar1
            [1] => baz1
            [2] => car1
        )

    [foo2] => Array
        (
            [0] => bar2
            [1] => baz2
            [2] => car2
        )

    [foo3] => Array
        (
            [0] => bar3
            [1] => baz3
            [2] => car3
        )

)
Sign up to request clarification or add additional context in comments.

5 Comments

the key ingredients of this recipe are the key() and next() functions in php ;)
you can loop through the final output string $str and print it in a format that you like (including the one you are interested in)
yeah it works but there is a little problem in it the array word appears like Array and i want array... Also array keys are enclosed in square brackets i dont want these brackets instead keys and values should be enclosed in quotes
did you check my updated answer? i added code that prints exactly like the one you want.
the one i mentioned in the question is for structure. The structure is properly generated with your code but i have use this generated string into another that means it works like code generation where it does not accept square brackets and Array. i hope you get it what i mean

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.