【问题标题】:php array unique and pushing dataphp数组唯一并推送数据
【发布时间】:2022-01-13 13:03:30
【问题描述】:

我从 mongodb 得到数据返回,当我搜索时,我发现我不能使用光标两次,所以我将所有数据放入数组中,现在我需要将数据拆分为唯一名称,即我得到的数据:

Array
(
    [0] => Array
        (
            [name] => 208
            [data] => 150
        )

    [1] => Array
        (
            [name] => 208
            [data] => 130
        )

    [2] => Array
        (
            [name] => 204
            [data] => 20
        )

    [3] => Array
        (
            [name] => 204
            [data] => 30
        )

    [4] => Array
        (
            [name] => 208
            [data] =>300
        )
)

我需要完成的是获取唯一名称并为每个名称推送数据返回:

[0] => Array
        (
            [name] => 208
            [data] => [150,130,300]
        )

    [1] => Array
        (
            [name] => 204
            [data] => [20,30]
        )
)

我可以获得唯一的名称,但不能将数据值推送到每个名称

我尝试了两个 foreach 循环但没有成功,感谢您的帮助

foreach ($cursor as $document) { 
    $name[] = $document['name']; 
    $data[] = $document['data']; 
} 
$uniName = array_unique($name); 
foreach($uniName as $theName) { 
    foreach($result as $two) { 
        $arr1['name'] = $two['name']; 
        if($theName == $towo['name']) { 
            $arr1['data'][] = $tow['data']; 
        } 
        array_push($result1,$arr1); 
    } 
} 

【问题讨论】:

  • 请向我们展示您的最佳尝试
  • 我所做的是首先使用 array_unique 获取唯一名称,然后在唯一数组上进行 foreach 循环,然后在另一个 foreach 循环中再进行一个 foreach 循环,并尝试仅将数据存储到现有数组名称但没有成功,我在这里问之前玩了很多,所以我没有在这里展示的例子,因为我改变了很多:(
  • 你有代码,给我们看看
  • 类似的东西:foreach ($cursor as $document) { $name[] = $document['name']; $data[] = $document['data']; } $uniName = array_unique($name); foreach($uniName as $theName) { foreach($result as $two) { $arr1['name'] = $two['name']; if($theName == $towo['name']) { $arr1['data'][] = $tow['data']; } array_push($result1,$arr1); } }

标签: php arrays


【解决方案1】:

可以使用一个简单的 foreach 循环来创建一个新数组。如果您使用'name' 作为键,那么这可以很容易地删除重复项。您所要做的就是检查您之前是否看到过这个name,如果没有在新数组中创建一个新条目,如果您之前看到过这个name,只需将数据项添加到数据数组即可。

$dataArray = 
[
    ['name'=> 208, 'data' =>150],
    ['name'=> 208, 'data' =>130],
    ['name'=> 204, 'data' =>20],
    ['name'=> 204, 'data' =>30],
    ['name'=> 208, 'data' =>300]
];


foreach ($dataArray as $key=>$sub){
    if ( isset($new[$sub['name']]) ) {
        // we saw this one before
        $new[$sub['name']]['data'][] = $sub['data'];
    } else {
        // first time we saw this one
        $new[$sub['name']] = ['name' => $sub['name'], 'data' => [$sub['data']]];
    }
}
$new = array_values($new);
print_r($new);

结果

Array
(
    [0] => Array
        (
            [name] => 208
            [data] => Array
                (
                    [0] => 150
                    [1] => 130
                    [2] => 300
                )

        )
    [1] => Array
        (
            [name] => 204
            [data] => Array
                (
                    [0] => 20
                    [1] => 30
                )
        )
)

【讨论】:

  • 哇非常感谢!! RiggsFolly 是完美的 :)
  • 我怎样才能得到我的示例结果中的结果?谢谢
  • 除了数组键是 208 而不是 0 等,这是您要求的数组。您是否只想将数组键设置回 0,1,2....
  • 是的,请在我的示例中使用数组 0,1,2 感谢您的帮助,我也在我身边尝试:)
  • 完成,只需使用array_values() 构建一个新数组,其数字从 0 开始
猜你喜欢
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多