2014-09-17 2 views
1

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

Вопрос

Мне нужно создать многомерный массив в 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); 

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

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

ответ

1

Да это вызывает этот вопрос

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

Что происходит, что ваш определить кнопку ключа с пустым вар $ кнопки также следующей итерации $ кнопка ISN» t и ваш скрипт может привести к неожиданному поведению

Почему бы не присвоить элемент $, как это?

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

Любая идея, как я могу «динамически» решение для каждого '$ id', что размер следующего массива должен быть? (2 или 3 клавиши). Действительно, теперь я создаю 3 ключевых вложенных массива для каждого '$ id', хотя в некоторых случаях требуется только 2 ключа во вложенном массиве. * Я только что заметил, что вы отредактировали свой пост, я проверю его. –

+1

Новое редактирование идет даже с меньшей кодовой базой –

+0

Ваша первая редакция, похоже, сработала! Теперь массивы чисты, нет пустых значений; как выглядит результат 'print_r()'. С другой стороны, я попробую другой подход. –

-1

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

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

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

+1

Пустые значения не должны туда попасть, это больше похоже на исправление –

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

Я мог бы сделать это таким образом, но я предпочитаю лучше понять, как создавать асимметричные многомерные массивы. Кнопка yes/no была использована только для моего вопроса. Реальная реализация отличается. –

+0

Если ваш результат json в вашей реальной реализации, то «асимметричные» массивы - это всего лишь плохая идея. –

+0

Не могли бы вы объяснить, почему «асимметричные» массивы - плохая идея, если позже я буду использовать json_encode()? –