数组操作:将一个数组转换为另一个数组

时间:2018-02-04 16:23:04

标签: php

几个小时后,我迷失在一个阵列中。

我有这样的事情:

$results = [
    "User_1" = [ 
        "Step_1" = "accepted",
        "Step_2" = "accepted",
        "Step_3" = "waiting",
        "Step_4" = "refused"
    ],
    "User_2" = [
        "Step_1" = "waiting",
        "Step_2" = "accepted",
        "Step_3" = "accepted",
        "Step_4" = "refused"
    ],
];

我需要对特定“步骤”的所有“状态”进行计数(并得到总和)。

在这种情况下,我希望:

$steps = [
    "Step_1" = [
        'acceptedSum' => 1,
        'refusedSum' => 0,
        'waitingSum' => 1
    ],
    "Step_2" =[
        'acceptedSum' => 2,
        'refusedSum' => 0,
        'waitingSum' => 0
    ],
    "Step_3" =[
        'acceptedSum' => 1,
        'refusedSum' => 0,
        'waitingSum' => 1
    ],
    "Step_4" =[
        'acceptedSum' => 0,
        'refusedSum' => 0,
        'waitingSum' => 2
    ],
];

[Nota:未定义用户数(1到N)和步数(1到4)]

任何帮助将不胜感激:)

谢谢你。

3 个答案:

答案 0 :(得分:2)

试试这个,看它是否有效。

$steps = array();
$count = 0;
$keys = array_keys(current($results));
foreach($keys as $key){
$accepted = 0;
$refused = 0;
$waiting = 0;
foreach ($results as $result) {
    foreach ($result as $k => $v) {
        if ($key==$k&&$v == 'accepted') {
            $accepted++;
        }
        if ($key==$k&&$v == 'refused') {
            $refused++;
        }
        if ($key==$k&&$v == 'accepted') {
            $waiting++;
        }

    }
}
$new_array = [
    'acceptedSum' => $accepted,
    'refusedSum' => $refused,
    'withoutAnswerSum' => $waiting
];
$steps[$key] = $new_array;
}

print_r($steps);

答案 1 :(得分:2)

您可以动态创建现有密钥。您可以使用值0添加缺少的键;

$results = [
    "User_1" => [
        "Step_1" => "accepted",
        "Step_2" => "accepted",
        "Step_3" => "waiting"
    ],
    "User_2" => [
        "Step_1" => "waiting",
        "Step_2" => "accepted",
        "Step_3" => "accepted"
    ],
    "User_3" => [
        "Step_1" => "refused",
        "Step_2" => "refused",
        "Step_3" => "waiting"
    ]
];

$steps = [];
$status = [];

foreach ($results as $result) {
    foreach ($result as $key => $r) {
        if (!array_key_exists($key, $steps)) {
            $steps[$key] = [];
        }
        if (!array_key_exists($r."Sum", $steps[$key])) {
            $steps[$key][$r."Sum"] = 0;
        }
        $steps[$key][$r."Sum"]++;
        $status[] = $r;
    }
}

foreach (array_unique($status) as $au) {
    foreach ($steps as &$step) {
        if (!array_key_exists($au."Sum", $step)) {
            $step[$au."Sum"] = 0;
        }
    }
}

print_r($steps);

Php output demo

答案 2 :(得分:0)

我认为你问题中的输出是错误的,但是你在寻找像这样的东西

<?php

$results = [
    "User_1" => [
        "Step_1" => "accepted",
        "Step_2" => "accepted",
        "Step_3" => "waiting"
    ],
    "User_2" => [
        "Step_1" => "waiting",
        "Step_2" => "accepted",
        "Step_3" => "accepted"
    ],
    "User_3" => [
        "Step_1" => "refused",
        "Step_2" => "refused",
        "Step_3" => "waiting"
    ]  
];

function sumByStatus($array, $status) {
    $filtered_array = array_filter($array,function($value) use ($status) {
        return $value === $status;
    });

    return count($filtered_array);
}

$newResult = array_map(function($item) {
    return [
        'acceptedSum' => sumByStatus($item, 'accepted'),
        'refusedSumF' => sumByStatus($item, 'refused'),
        'withoutAnswerSum' => sumByStatus($item, 'waiting')
    ];
}, $results);

print_r($newResult);

输出

Array
(
    [User_1] => Array
        (
            [acceptedSum] => 2
            [refusedSum] => 0
            [withoutAnswerSum] => 1
        )

    [User_2] => Array
        (
            [acceptedSum] => 2
            [refusedSum] => 0
            [withoutAnswerSum] => 1
        )

    [User_3] => Array
        (
            [acceptedSum] => 0
            [refusedSum] => 2
            [withoutAnswerSum] => 1
        )

)