Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
193 views
in Technique[技术] by (71.8m points)

How to manipulate array in php

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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
        )

)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...