在PHP中创建非对称多维数组


Create asymmetrical multidimensional array in PHP

我有一个小问题,似乎很难解决。修复可能很容易,但我太笨了,自己无法修复。也许你们可以对此有所了解。

问题

我需要用PHP创建一个多维数组。这很好用。然而,最后一个嵌套数组有时由2个元素组成,有时由3个元素组成。因此,这篇文章的标题是"不对称的"。

这个问题很可能是由基于我的PHP代码中的开关变量创建嵌套数组引起的。如果未定义变量(例如case 'inactive'中的$button),则键无论如何都会放在$elements数组中,但没有值。

PHP代码

$player = Array();
$data = @$_POST['players'];
if (!empty($data) && is_array($data)) {
    foreach($data as $id){
        $player_info = mysqli_query($connection, "SELECT * FROM players WHERE id = '$id'");
        $player_info = mysqli_fetch_assoc($player_info);
        switch ($player_info['status']) {
            case 'active':
                $color = '#30B490';
                $status = 'active';
                $button = 'buttons';
                break;
            case 'inactive':
                $color = '#A1A1A1';
                $status = 'inactive';
                break;
            case 'standby':
                $color = '#F0AD4E';
                $status = 'standby';
                $button = 'buttons';
                break;
            default:
                $color = '#4FA1D9';
                $status = 'unknown';
                break;
        }
        // THIS PART SEEMS TO CAUSE MY ISSUE
        $elements = array(
            "indicator" => $color,
            "status" => $status,
            "button" => $button
        );
        // THIS PART SEEMS TO CAUSE MY ISSUE
        foreach ($elements as $label => $element) {
            $player[$id][$label] = $element;
        }
    }
}
print_r($player);

print_r()结果

当前

Array (
    [1] => Array (
        [indicator] => #A1A1A1
        [status] => inactive
        [button] =>
    )
    [2] => Array (
        [indicator] => #30B490
        [status] => active
        [button] => yes
    )
    [3] => Array (
        [indicator] => #4FA1D9
        [status] => standby
        [button] => yes
    )
)

应该是什么

Array (
    [1] => Array (
        [indicator] => #A1A1A1
        [status] => inactive
    )
    [2] => Array (
        [indicator] => #30B490
        [status] => active
        [button] => yes
    )
    [3] => Array (
        [indicator] => #4FA1D9
        [status] => standby
        [button] => yes
    )
)

您可以看到这两个结果之间的差异。看看[button] =>。当我json_encode()处理整个多维数组时,结果显示一个值null,这似乎不正确。

{"1":{"indicator":"#A1A1A1","status":"inactive","button":null},"2":{"indicator":"#30B490","status":"active","button":"buttons"},"3":{"indicator":"#4FA1D9","status":"unknown","button":"buttons"}}

我想要什么

我希望多维数组是干净的(没有空值),就像print_r()结果中显示的那样。

你知道我应该在PHP代码中编辑什么来创建一个合适的多维数组吗?

谨致问候,Peter de Leeuw

是的,这会导致问题

    // THIS PART SEEMS TO CAUSE MY ISSUE
    $elements = array(
        "indicator" => $color,
        "status" => $status,
        "button" => $button
    );

发生的情况是,你用一个空的var$按钮定义键按钮,下一次迭代$按钮也没有重置,你的脚本可能会导致一些意想不到的行为

为什么不这样分配$元素呢?

    switch ($player_info['status']) {
        case 'active':
            $elements = array(
            'color' => '#30B490',
            'status' => 'active',
            'button' => 'buttons');
            break;
        case 'inactive':
            $elements = array(
            'color' = '#A1A1A1',
            'status' = 'inactive');
            break;
        case 'standby':
            $elements = array(
            'color' => '#F0AD4E',
            'status'  => 'standby',
            'button' => 'buttons');
            break;
        default:
            $elements = array(
              'color' => '#4FA1D9';
              'status' => 'unknown');
            break;
    }

甚至像这样:

    $player[$id]['status'] = $player_info['status'];
    switch ($player_info['status']) {
        case 'active':
            $player[$id]['color'] = '#30B490';
            $player[$id]['button'] = 'buttons';
            break;
        case 'inactive':
            $player[$id]['color'] = '#A1A1A1';
            break;
        case 'standby':
            $player[$id]['color'] = '#F0AD4E';
            $player[$id]['button'] = 'buttons';
            break;
        default:
            $player[$id]['color'] = '#F0AD4E';
            $player[$id]['status'] = 'unknown'; //overwrite status from database to unknown
            break;
    }

或更小的

//Outside the loop
$colors = array('active' =>'#30B490', 'inactive' => '#A1A1A1', 'standby' => '#F0AD4E');
//Inside the loop
$player[$id]['status'] = $player_info['status'];
$player[$id]['color'] = isset($colors[$player_info['status']) ? $colors[$player_info['status'] : '#4Fa1D9'; 
if($player[$id]['status'] == 'active' || $player[$id]['status'] == 'standby') 
    $player[$id]['buttons'] = 'buttons';

为什么不给$button分配一个"no"值呢?

switch ($player_info['status']) {
    case 'active':
        $element = array(
        'color' => '#30B490',
        'status' => 'active',
        'button' => 'buttons');
        break;
    case 'inactive':
        $element = array(
        'color' = '#A1A1A1',
        'status' = 'inactive');
        'button' => 'no');
        break;
    case 'standby':
        $element = array(
        'color' => '#F0AD4E',
        'status'  => 'standby',
        'button' => 'buttons');
        break;
    default:
        $element = array(
          'color' => '#4FA1D9';
          'status' => 'unknown');
        break;
}

这将有助于您稍后使用json.parse 处理答案

您可以简单地使用array_filter()

$player = array_map('array_filter', $player);

这将清除$player 中每个数组的空值