【问题标题】:How to manipulate array in php如何在php中操作数组
【发布时间】:2012-08-08 15:43:59
【问题描述】:

我陷入了数组操作任务。

场景:
我有一个对象数组。示例:

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'
        )
)

我必须把它转换成这种形式:

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

这是我为实现此目的而创建的函数:

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;
}

但是这个函数的输出是:

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

我知道这是因为我在 $finalString 中使用的最后一个内爆函数,但我不明白应该使用什么来获得我想要的输出。

任何帮助或建议将不胜感激。

更新:
最终的数组应该以字符串格式返回。

【问题讨论】:

  • 您是否想弄清楚如何将最终数组的元素名称从 0、1、2 重命名为 foo1、foo2、foo3?
  • 如果你在做 $attrib->primary_key 那么你的 $attributes 不是一个数组数组,而是一个对象数组,和你展示的不太一样
  • 你可以遍历数组,然后对于每个条目 array_shift() 关闭第一个元素并将其用作键,然后内容是余数的 array_values()。
  • 哦,是的,这是我的错误,它实际上是一个对象......
  • 你能把输入数据重写为对象而不是数组,这样我们就可以看到结构了吗?另外,您需要获取数组还是将其转换为纯字符串?

标签: php arrays string


【解决方案1】:

更新 2

除了我之前发布的以下代码之外,您还可以使用以下代码以您想要的形式“漂亮地打印”您的数组:

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

将输出:

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

希望对你有帮助!


更新

在您更新问题并提到该数组由 stdClass 对象组成后,我更新了与 stdClass 一起使用的代码,然后将输出存储在一个字符串变量中,以后可以打印:

<?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>";

以上代码将在屏幕上打印以下输出:

[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
        )

)

【讨论】:

  • 这个秘籍的关键成分是 php 中的 key() 和 next() 函数;)
  • 你可以遍历最终的输出字符串 $str 并以你喜欢的格式打印出来(包括你感兴趣的那个)
  • 是的,它可以工作,但是有一个小问题,数组单词看起来像数组,我想要数组...数组键也括在方括号中,我不想要这些括号,而是键和值应该用引号括起来
  • 您查看我更新的答案了吗?我添加了与您想要的完全一样的代码。
  • 我在问题中提到的是结构。该结构是使用您的代码正确生成的,但我已将此生成的字符串用于另一个字符串,这意味着它的工作方式类似于代码生成,它不接受方括号和数组。我希望你明白我的意思
猜你喜欢
  • 2022-08-19
  • 2016-03-20
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多