繁体   English   中英

无法在关联数组php上组合值

[英]Trouble combining values on associative array php

我有一个存储在这样的变量中的关联数组

$result = Array ( 
[0] => stdClass Object ( [user_id] => 3 [zone_id] => -1 ) 
[1] => stdClass Object ( [user_id] => 3 [zone_id] => 0 ) 
[2] => stdClass Object ( [user_id] => 3 [zone_id] => 2 ) 
[3] => stdClass Object ( [user_id] => 3 [zone_id] => 3 ) 
[4] => stdClass Object ( [user_id] => 3 [zone_id] => 4 ) 
[5] => stdClass Object ( [user_id] => 4 [zone_id] => 0 ) 
[6] => stdClass Object ( [user_id] => 4 [zone_id] => 2 ) 
[7] => stdClass Object ( [user_id] => 4 [zone_id] => 4 ) 
[8] => stdClass Object ( [user_id] => 4 [zone_id] => 5 ) 
[9] => stdClass Object ( [user_id] => 4 [zone_id] => 7 )) 

我想将其转换为看起来更像这样的数组

$newResult = array( 
[0] => stdClass Object ( [user_id] => 3 [zone_id] => "-1;0;1;2;3;4" )
[1] => stdClass Object ( [user_id] => 3 [zone_id] => "0;2;4;5;7" ))

我尝试使用这篇文章作为参考,但是在此过程中遇到了麻烦。 当我简单地用我的变量替换我收到此错误

[Thu Oct 09 15:21:29 2014] [error] [client xxx.xxx.xx.xx] PHP Fatal error:  Cannot use object of type stdClass as array in index.php on line 38

当我将$n['zone_id']转换$n['zone_id'] $n->zone_id ,错误为零,但zone_id似乎循环循环并永远重复。

更重要的是,我还需要忽略0-9范围以外的任何数字(例如-1和10)。

有什么见解吗? 我觉得应该更容易解决!

谢谢。

它未经测试,但如果我了解您的尝试,应该可以使用

$new_array = [];

for($i = 0; $i < count($result); $i++) {
    if(!in_array($result[$i]->user_id, $new_array[$i])) {
        $new_array[$result[$i]->user_id] = [
            'user_id' => $result[$i]->user_id,
            'zone_id' => $result[$i]->zone_id
        ];
    } else {
        $new_array[$result[$i]['user_id']]['zone_id'] += ';' . $result[$i]['zone_id'];
    }
}

正如我在评论中所写-您有一个对象数组,它是由这样的东西创建的(我通过做一个反向操作来写一个简单的例子-将数组强制转换为对象,但与您的对象完全相同,您可以检查一下)

$result = array ( 
 (object) array( 'user_id' => 3, 'zone_id' => -1 ),
 (object) array( 'user_id' => 3, 'zone_id' => 0 ),
 (object) array( 'user_id' => 3, 'zone_id' => 2 ),
 (object) array( 'user_id' => 3, 'zone_id' => 3 ),
 (object) array( 'user_id' => 3, 'zone_id' => 4 ),
 (object) array( 'user_id' => 4, 'zone_id' => 0 ),
 (object) array( 'user_id' => 4, 'zone_id' => 2 ),
 (object) array( 'user_id' => 4, 'zone_id' => 4 ),
 (object) array( 'user_id' => 4, 'zone_id' => 5 ),
 (object) array( 'user_id' => 4, 'zone_id' => 7 ),
);

您必须遍历数组并分别处理每个对象(与对象一样),或者在循环中可以将其转换为数组以像关联数组一样使用它(例如下面的示例)

$out = array();
foreach($result as $o)
{
    $oArray = (array)$o; // cast to array
    if (!isset($out[$oArray['user_id']]))
       $out[$oArray['user_id']] = $oArray;
    else
       $out[$oArray['user_id']]['zone_id'] .= ';' . $oArray['zone_id']; 
}
var_dump(array_values($out)); // output and reset keys

结果是

array(2) {
  [0]=>
  array(2) {
    ["user_id"]=>
    int(3)
    ["zone_id"]=>
    string(8) "-1;0;2;3;4"
  }
  [1]=>
  array(2) {
    ["user_id"]=>
    int(4)
    ["zone_id"]=>
    string(11) "0;2;4;5;7"
  }
}

但是,如果您要遍历对象,而不将它们每个都转换为数组,那么您的代码将如下所示

foreach($result as $o)
{
    if (!isset($out[$o->user_id]))
       $out[$o->user_id] = (array)$o;
    else
       $out[$o->user_id]['zone_id'] .= ';' . $o->zone_id; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM