【问题标题】:Create asymmetrical multidimensional array in PHP在 PHP 中创建非对称多维数组
【发布时间】:2023-03-03 02:44:01
【问题描述】:

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

问题

我需要在 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
    )
)

您可以看到 2 个结果之间的差异。看看[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 代码中编辑什么以创建正确的多维数组吗?

最好的问候, 彼得·德·卢

【问题讨论】:

    标签: php arrays multidimensional-array asymmetric


    【解决方案1】:

    是的,这导致了问题

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

    发生的情况是,您使用空的 var $button 定义键按钮,并且下一次迭代 $button 未重置,您的脚本可能会导致一些意外行为

    为什么不这样分配 $element 呢?

        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';
    

    【讨论】:

    • 知道如何“动态地”为每个$id 决定下一个数组的大小吗? (2 或 3 个键)。事实上,现在我为每个 $id 创建了一个 3 键嵌套数组,即使某些情况下嵌套数组中只需要 2 个键。 * 我刚刚注意到您编辑了您的帖子,我会检查一下。
    • 您的第一次编辑似乎成功了!数组现在很干净,没有空值; print_r() 结果应该是什么样子。从那以后我也会尝试另一种方法。
    • 让你的脚本小 10 倍 ;)
    【解决方案2】:

    你可以简单地使用array_filter()

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

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

    【讨论】:

    • 空值不应该放在那里,这感觉更像是修补它
    【解决方案3】:

    为什么不给 $button 分配一个“否”值呢?

    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 处理您的答案

    【讨论】:

    • 我可以这样做,但我更喜欢学习一种更好的方法来创建非对称多维数组。是/否按钮仅用作我的问题的案例。真正的实现是不同的。
    • 如果在实际实现中输出是 json,那么“不对称”数组无论如何都是个坏主意。
    • 如果我稍后json_encode()它,你能解释一下为什么“不对称”数组是个坏主意吗?
    • 解析 json 是通过 key:value 循环的,并且在每个循环中具有相同的索引计数是强制性的。 (好吧,你可以在另一边添加条件来为丢失的按钮重新创建一个空值,但是为什么要首先删除它呢?)"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多