Создание нового массива на основе разнесенного массива

#php #arrays

#php #массивы

Вопрос:

Я пытаюсь создать новый массив ($ names) того же размера, что и массив $ years. Я перебираю переменную $ year, но изо всех сил пытаюсь удвоить «Разнесите» переменную $ years_names (сначала через запятую, затем через двоеточие), и не уверен, что это лучший способ. Также из-за этого я не могу использовать search_array. Поскольку в нем может не быть данных за каждый год, я бы хотел, чтобы новый массив содержал нулевое значение в позиции за этот год. Итак, в моей переменной $ years_names мне не хватает данных с 2010 по 2012 год, поэтому индексы 0-1 должны быть нулевыми, а индекс 8 — поскольку данных для этого 2018 года тоже нет. Прилагается более или менее то, что я пытаюсь получить для своего массива $names. Спасибо!

введите описание изображения здесь

 $years = range(2010, 2020);

$data_years = "2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020";
$data_names = "Charlie,Lucy,Linus,Pig Pen,Snoopy,Woodstock,Peppermint Patty,Marcie";

$years_names = "2012:Charlie,2013:Lucy,2014:Linus,2015:Pig Pen,2016:Snoopy,2017:Woodstock,2019:Peppermint Patty,2020:Marcie";
$Exploded = explode(',', $years_names);
$names = [];

foreach($Exploded as $i => $item) {
     $names[$i] = explode(':', $item);
    //echo "i= {$i}<br/>";
    //echo "item= {$item}<br/>";
    //echo $names[$i][0] . ':' . $names[$i][1] . "<br/>";
}
  

Комментарии:

1. Почему ваши данные в этом формате?

2. Данные передаются из вызова API таким образом. Массив $ years и $ names затем используется в графической диаграмме, поэтому мне, к сожалению, нужно работать с тем, как предоставляются данные.

3. Это очень странный формат для использования, вы уверены, что API не может предоставить другой формат?

4. Есть два дополнительных вывода со значениями даты и имени в строковом списке, но у меня все та же проблема с заполнением массива $names .

5. Отредактировал сообщение, чтобы добавить два других значения $data_years и $data_name … к сожалению, это все, что у меня есть.

Ответ №1:

Вы можете сделать что-то вроде этого

 $years = range(2010, 2020);
$years_names = "2012:Charlie,2013:Lucy,2014:Linus,2015:Pig Pen,2016:Snoopy,2017:Woodstock,2019:Peppermint Patty,2020:Marcie";

//split `$years_names` at comma
$split_values = explode(',', $years_names);

//convert values to a more usable format
$split_values = array_reduce($split_values, function($return, $item) {
    
    //explode $item (e.g `2012:Charlie`) at the colon symbol
    $explode = explode(':', $item);
    
    //separate year from name as key => value
    $return[$explode[0]] = $explode[1];

    //this return reduces the current iteration of `$split_values` to the key=>value pair
    return $return;
});

$names = [];
foreach($years as $year) {
    
    //set default value as null. If year is not found in next loop, this will remain
    $names[$year] = null;
    
    //check if year exists in $split_values
    if(array_key_exists($year, $split_values)) {
        
        //if it does, set $names[$year] to that value
        $names[$year] = $split_values[$year];
    }
    
}

print_r($names);
  

Вывод

 Array
(
    [2010] => 
    [2011] => 
    [2012] => Charlie
    [2013] => Lucy
    [2014] => Linus
    [2015] => Pig Pen
    [2016] => Snoopy
    [2017] => Woodstock
    [2018] => 
    [2019] => Peppermint Patty
    [2020] => Marcie
)
  

Комментарии:

1. Спасибо, приятель. Я попробую, но это делает вещи более понятными. Спасибо.