【问题标题】:How to format an php array to desired result [closed]如何将php数组格式化为所需的结果[关闭]
【发布时间】:2019-12-09 07:51:39
【问题描述】:

我需要在图表中显示一些数据。基本上我有一个来自数据库的数组,看起来像这样 -

[
    [0] =>[

            [user_type] => 'Manager'
            [total_count] => 3

        ],


    [1] =>[

            [user_type] => 'Director'
            [total_count] => 2

        ]

]

还有一个user_type,即Trainee。如果用户 Trainee0 Total_count 它不会出现在上面的数组中。所以我需要手动添加。因此,首先将检查 3 个 user_types 中的哪个 user_type 不存在于上述数组中。如果不存在则只需添加total_count0

最后我想要的数组应该是这样的-

[
    ['labels'] =>['Manager','Director','Trainee],


    ['dataset'] => [ 3, 2, 0 ]

]

请注意,正确的顺序非常重要。所以在上面的数组中,Manager 有 3 个,Director 有 2 个,Trainee 有 0 个总数。

提前致谢!

【问题讨论】:

  • 首先创建一个关联数组,将标签映射到计数。然后使用array_keysarray_values在结果中得到你想要的两个数组。
  • 您的数据库中是否有一个单独的用户类型表,其中包含所有可能的类型,或者它只是用户表中的一个文本列?这个数组是 group by/count 查询的结果吗?
  • 是的,它的文本基础计数查询)

标签: php arrays php-7


【解决方案1】:

这里是你可以使用 array_combine 和 array_map 和 splat(...) 操作符的脚本

$arr = array_combine(['labels','dataset'],array_map(null, ...$arr));
if(!in_array('Trainee',$arr['labels'])){
    array_push($arr['labels'],'Trainee');
    array_push($arr['dataset'],0);
}
print_r($arr);die;

array_combine — 使用一个数组作为键,另一个作为值来创建一个数组

注意:- 在 array_map 中,NULL 可以作为值传递给回调以执行 zip 对多个数组进行操作。如果只提供了array1,array_map() 将返回输入数组。总之就是进行数组转置操作

Working demo

输出:-

Array
(
    [labels] => Array
        (
            [0] => Manager
            [1] => Director
            [2] => Trainee
        )

    [dataset] => Array
        (
            [0] => 3
            [1] => 2
            [2] => 0
        )

)

【讨论】:

  • 感谢您的回答。在这里我可以看到,只有当受训者不存在时。但实际上它可能是 Manager 或 Director 或两者兼有,然后也需要将它们的计数设置为 0。那么如何实现呢?
  • 如果只从数据库中获取一行呢?然后需要手动添加2个user_type并设置为0
  • 那么请简明扼要地更新您的问题
【解决方案2】:

试试下面的代码也许会有所帮助。

/*
using array column will get the result in 
Array ( [Manager] => 3 [Director] => 2 )
*/

$array_column = array_column($array, 'total_count', 'user_type');
//Create new array like below
$add_array = array('Manager'=>'0', 'Director'=>'0', 'Trainee'=>'0',);

//using array_merge merge add_array and array_column
$new_array = array_merge($add_array, $array_column);

//using array_walk_recursive get the requird result
array_walk_recursive($new_array, function($item, $key) use (&$final_array){

    $final_array['labels'][]=$key;
    $final_array['dataset'][]=$item;
    });

echo "<pre>";
print_r($final_array);

?>

案例 1- 如果 Trainee 不在数组中 DEMO

案例 2 - 如果 Manager 和 Director 都不在数组中 DEMO

案例 3 - 如果主任不在 - DEMO

【讨论】:

  • 谢谢,希文德拉!它有效!
  • 很高兴帮助你..:)
【解决方案3】:

试试这个

$arr = array_combine(['labels','dataset'], array_map(null, $arr));

创建一个函数,将不存在的 user_type 添加到数组中

function setUserType($userType, $array) {
    if(!in_array($userType, $array['labels'])){
        array_push($array['labels'], $userType);
        array_push($array['dataset'], 0);
    }

    return $array;
}

任何用户类型的调用函数,如“经理”、“实习生”、“主管”

$arr = setUserType('Trainee', $arr);

或者创建一个包含所有用户类型的数组并运行一个循环

foreach(['Manager', 'Trainee', 'Director'] as $type) {
 $arr = setData($type, $arr);   
}

打印并显示最终值

print_r($arr);
die();

演示https://3v4l.org/UbiXn

【讨论】:

    【解决方案4】:

    试试看

    $array = array();
    foreach($yourArr as $row)
    {
      $array['labels'][] = $row['user_type'];
      $array['dataset'][] = $row['total_count'];
    }
    print_r($array);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2011-01-19
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多