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

0

У вас такой массив

Array
(
[0] => Array
    (
        [CategoriesName_1] => Happy Birthday
        [CategoriesName_2] => Flowers
        [CategoriesName_3] => Fruit baskets
        [CategoriesDescription_1] => 
        [CategoriesDescription_2] => 
        [CategoriesDescription_3] => Fruit baskets descr
        [CategoriesUrl_1] => happy-birthday
        [CategoriesUrl_2] => flowers
        [CategoriesUrl_3] => fruit-baskets
    )

)

Хотите преобразовать его в массив, как это (нужно получить этот результат)

Array
(
[0] => Array
    (
        [CategoriesName] => Happy Birthday
        [CategoriesDescription] => 
        [CategoriesUrl] => happy-birthday
    )
[1] => Array
    (
        [CategoriesName] => Flowers
        [CategoriesDescription] => 
        [CategoriesUrl] => flowers
    )
[2] => Array
    (
        [CategoriesName] => Fruit baskets
        [CategoriesDescription] => Fruit baskets descr
        [CategoriesUrl] => fruit-baskets
    )       

)

Начальный (одномерный массив) имеет ключи CategoriesName_1, CategoriesUrl_1, CategoriesDescription_1. Для каждого числа (_1, _2, _3) нужно поместить имя, URL и описание вместе и создать отдельный подмассив.

Сначала были созданы 3 отдельных массива

foreach ( $array_with_breadcrumbs[0] as $key_brcr => $val_brcr ) {

if( 'CategoriesUrl_' == substr($key_brcr,0,14) ){
$array_url_brcr[] = array( 'CategoriesUrl' => $val_brcr );
}

if( 'CategoriesName_' == substr($key_brcr,0,15) ){
$array_name_brcr[] = array( 'CategoriesName' => $val_brcr );
}

if( 'CategoriesDescription_' == substr($key_brcr,0,22) ){
$array_description_brcr[] = array( 'CategoriesDescription' => $val_brcr );
}

}//foreach ( $array_with_breadcrumbs[0] as $key_brcr => $val_brcr ) {

Затем пропустите все три массива, подобные этому

foreach( $array_url_brcr as $i_url => $val_url ){

  foreach( $array_name_brcr as $i_name => $val_name ){

    foreach( $array_description_brcr as $i_description => $val_description ){

      if( $i_url == $i_name ) {

      $combined_arr_brcr[] = array( 
      'CategoriesUrl' => $val_url['CategoriesUrl'], 
      'CategoriesName' => $val_name['CategoriesName'], 
      'CategoriesDescription' => $val_description['CategoriesDescription']
      );

      }

    }

  }

}

Я получаю девять (3 массива * 3 цикла) субмарины с ожидаемыми результатами. Из результатов я должен написать дополнительный код, где я беру (сохраняю) первый, пятый и девятый подмары.

Код выглядит очень длинным. Есть ли лучший (более короткий, более простой) способ получить результат?

Теги:
arrays
multidimensional-array

2 ответа

1
Лучший ответ
$final_array=array();
for ($i=0; $i < 3; $i++) { 
    $k=$i+1;
    $final_array[$i]=array(
        'CategoriesName'=>$array_with_breadcrumbs[0]['CategoriesName_'.$k],
        'CategoriesDescription'=>$array_with_breadcrumbs[0]['CategoriesDescription_'.$k],
        'CategoriesUrl'=>$array_with_breadcrumbs[0]['CategoriesUrl_'.$k],
        );
}

print_r($final_array);

если количество ключей больше 3, вы можете использовать это

$final_array=array();
$no_of_keys=3; //change the value of number of keys
$vars=array('CategoriesName','CategoriesDescription','CategoriesUrl'); // add variables

for ($i=0; $i < $no_of_keys; $i++) { 
    $k=$i+1;
    $final_array[$i]=array();
    foreach ($vars as $var) {
        $final_array[$i][$var]=$array_with_breadcrumbs[0][$var."_".$k]
    }
}

print_r($final_array);
0
$source = $array_with_breadcrumbs[0];
$result = [];

for ($i = 1; $i <= 3; $i++)
{
    array_push($result,
    [
        'CategoriesName' => $source['CategoriesName_' . $i],
        'CategoriesDescription' => $source['CategoriesDescription_' . $i],
        'CategoriesUrl' => $source['CategoriesUrl_' . $i]
    ]);
}

var_dump($result);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню