2016-04-04 4 views
0

У меня есть массив $d_visitors = array_count_values($d_visitors);Как сгенерировать массив с использованием массива значений по умолчанию и нового массива значений?

array:7 [▼ 
    2 => 4 
    5 => 1 
    8 => 2 
    3 => 1 
    1 => 2 
    9 => 3 
    0 => 2 
] 

Я пытаюсь Переберите этот массив в 24 раза, и проверить, если ключевые спичек и сохранить свое значение.

$dv = []; 
for ($i = 0; $i < 24; $i++){ 
    foreach ($d_visitors as $k =>$v) { 
     if($i == $k){ 
      $dv[$i] = $v; 
     }else{ 
      $dv[$i] = 0; 
     } 
    } 
} 

Я пытаюсь напечатать что-то вроде этого:

array:24 [▼ 
    0 => 2 
    1 => 2 
    2 => 4 
    3 => 1 
    4 => 0 
    5 => 1 
    6 => 0 
    7 => 0 
    8 => 2 
    9 => 3 
    10 => 0 
    11 => 0 
    12 => 0 
    13 => 0 
    14 => 0 
    15 => 0 
    16 => 0 
    17 => 0 
    18 => 0 
    19 => 0 
    20 => 0 
    21 => 0 
    22 => 0 
    23 => 0 
] 

Но я продолжал получать это:

array:24 [▼ 
    0 => 2 
    1 => 0 
    2 => 0 
    3 => 0 
    4 => 0 
    5 => 0 
    6 => 0 
    7 => 0 
    8 => 0 
    9 => 0 
    10 => 0 
    11 => 0 
    12 => 0 
    13 => 0 
    14 => 0 
    15 => 0 
    16 => 0 
    17 => 0 
    18 => 0 
    19 => 0 
    20 => 0 
    21 => 0 
    22 => 0 
    23 => 0 
] 
+1

Не нужно класть часть. – Yash

+0

@Yash: Удаляя его, я получил этот массив ': 7 [▼ 0 => 2 1 => 2 2 => 4 3 => 1 5 => 1 8 => 2 9 = > 3 ] 'Моя цель - получить 24 из них. :) – ihue

+0

Похоже ** @ u_mulder ** получил мою мысль. – ihue

ответ

2

Попробуйте так:

$dv = []; 
for ($i = 0; $i < 24; $i++){ 
    $dv[$i] = 0; 
    if (isset($d_visitors[$i])) { 
     $dv[$i] = $d_visitors[$i]; 
    } 
} 

Подробнее упрощен:

$dv = []; 
for ($i = 0; $i < 24; $i++){ 
    $dv[$i] = isset($d_visitors[$i])? $d_visitors[$i] : 0; 
} 

Проблема в коде в строке $dv[$i] = 0;, как он устанавливает в ноль $dv[$i], который ранее был установлен.

1

Вам необходимо использовать переменную flag. Ваш код также верен.

Попробуйте так:

$dv = []; 
     $flag = 0; 
     for ($i = 0; $i < 24; $i++){ 
      $flag = 0; 
      foreach ($d_visitors as $k =>$v) { 
       if($i == $k){ 
        $dv[$i] = $v; 
        $flag = 1; 
       } 
      } 
      if($flag == 0){ 
       $dv[$i] = 0; 
      } 
     } 
1

Другим способом спрашивать ваш процесс является:

Как я могу:

  1. объединить массив по умолчанию с другим массивом, основанный на клавишах
  2. и ksort() массив результатов?

В то время как вы можете достичь желаемого результата с помощью foreach() цикла и условие о на каждой итерации, я могу показать вам более кратким, простой подход:

Это ваш новый массив данных: $array=[2=>4,5=>1,8=>2,3=>1,1=>2,9=>3,0=>2];

Есть два способа настройки вашего массива данных по умолчанию:

$defaults=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // 24 elements with 0 value 

или более элегантно:

$defaults=array_fill(0,24,0); 

Затем вам нужно позвонить только array_replace(), чтобы перезаписать значения по умолчанию новыми значениями. Это сохранит ключи в порядке ASC.

var_export(array_replace($defaults,$array)); 

Вы можете даже гнездятся вызовы функций и избегать добавления имен переменных в глобальном масштабе, как это:

$d_visitors=array_replace(array_fill(0,24,0),array_count_values($d_visitors))); 

Done - слиты и ksorted.


Чтобы показать некоторые другие способы, которые программисты могут попытаться объединить два массива (бесплодно или нелогично), вот demonstration.

 Смежные вопросы

  • Нет связанных вопросов^_^