1

簡単に理解できない小さな問題があります。修正はおそらく非常に簡単ですが、私は自分で修正するにはあまりにも初心者です。おそらく、皆さんはこれに光を当てることができます。

問題

PHP で多次元配列を作成する必要があります。これはうまくいきます。ただし、最後のネストされた配列は 2 つの要素で構成されている場合もあれば、3 つの要素で構成されている場合もあります。したがって、この投稿のタイトルは「非対称」です。

この問題は、PHP コードのスイッチ変数に基づいてネストされた配列が作成されたことが原因である可能性が最も高いです。変数が定義されていない場合 ( $buttonincase 'inactive'など)、キーは$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 コードで何を編集すればよいでしょうか?

よろしく、ピーター・デ・レーウ

4

3 に答える 3

0

うん、これは問題を引き起こします

    // 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';
于 2014-09-17T09:55:31.533 に答える
-1

あなたは単に使用することができますarray_filter()

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

これにより、すべての配列の空の値が消去されます$player

于 2014-09-17T10:00:54.750 に答える