Создать асимметричный многомерный массив в переполнении стека

У меня есть небольшая проблема, которую я не могу понять легко. Исправление, вероятно, довольно легко, но я слишком много нуб, чтобы исправить это сам. Возможно, вы, ребята, могли бы пролить свет на это.

Мне нужно создать многомерный массив в PHP. Это работает просто отлично. Тем не менее, последний вложенный массив иногда состоит из 2 элементов, а иногда из 3. Следовательно, «асимметричный» в заголовке этого поста.

Скорее всего, проблема вызвана созданием вложенного массива на основе переменных-переключателей в моем PHP-коде. Когда переменная не определена ($button в case 'inactive' например), ключ находится внутри $elements массив в любом случае, но без значения.

$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);

В настоящее время

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, чтобы создать правильный многомерный массив?

С наилучшими пожеланиями,
Питер де Леув

1

Решение

Да, это вызывает проблему

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

То, что происходит, это то, что вы определяете кнопку key с пустой кнопкой 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';
0

Другие решения

Почему бы вам просто не назначить вместо кнопки $ значение «нет»?

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

0

Вы могли бы просто использовать array_filter()

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

Это очистит пустые значения каждого массива в $player

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector