2015-02-02 2 views
-1

У меня есть несколько массивов, как это:создать новый массив из существующего массива

array (
[floorBuildingName] => Array 
    (
     [0] => Lt.1 
     [1] => Lt.2 
    ) 

[roomFloorName] => Array 
    (
     [0] => Single 
     [1] => Medium1 
     [2] => MaXI 
    ) 
) 

Я хотел бы объединить два массива в один массив.

Например:

array (
[0] => array(
    [0] =>Lt.1, 
    [1] =>Single 
    ), 
[1] => array(
    [0] =>Lt.2, 
    [1] =>Medium1 
    ), 
    [2] => array(
    [0] =>Lt.2, 
    [1] =>MaXI 
    ) 
) 

Как я могу добиться этого?

+1

Это не ясно, как вы хотите, чтобы объединить два массива. Например, почему Lt.1 идет с одиночным и Lt.2, переходите к Medium1 и MaXI. Являются ли они всегда единственными значениями двух массивов? –

ответ

0

Вы можете сделать это с помощью array_map очень легко:

Попробуйте этот код:

$arr1 = array(1, 2); 
$arr2 = array('one', 'two', 'three', 'four'); 

while(count($arr1) != count($arr2)) { 
    //If Array1 is Shorter then Array2 
    if (count($arr1)<count($arr2)) { 
     $arr1[] = $arr1[count($arr1) - 1]; 
    } 
    //If Array2 is Shorter then Array1 
    if (count($arr1) > count($arr2)) { 
     $arr2[] = $arr2[count($arr2) - 1]; 
    } 
} 
//Now merge arrays 
$newarray = (array_map(null, $arr1, $arr2)); 


print_r($newarray); 

Выведет:

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => one 
     ) 

    [1] => Array 
     (
      [0] => 2 
      [1] => two 
     ) 

    [2] => Array 
     (
      [0] => 2 
      [1] => three 
     ) 

    [3] => Array 
     (
      [0] => 2 
      [1] => four 
     ) 
) 
+1

Проблема в том, что вам нужно иметь массивы с одинаковым количеством аргументов. –

+2

Кроме того, ОП на самом деле не объяснил, как он хочет, чтобы эти два слились. Похоже, что это простое слияние, но, возможно, нам нужна дополнительная информация из проблемной области, чтобы увидеть, что означает объединенный массив, возможно, он должен быть более рассчитан, чем простое слияние. –

0

есть решение для различного количества аргументов:

$floorBuildingName = array(
     'Lt.1', 
     'Lt.2' 
    ); 
$roomFloorName = array(
     'Single', 'Medium1', 'MaXI' 
); 

class ValueArrayIterator extends ArrayIterator 
{ 

    protected $arrays; 

    protected $latestValues = []; 

    public function __construct(array $mainArray) { 
     parent::__construct($mainArray); 
     $this->arrays = func_get_args(); 
    } 

    public function current() 
    { 
     $returnValue = []; 

     foreach ($this->arrays as $arrayKey => $array) { 
      if (isset($array[$this->key()])) { 
       $this->latestValues[$arrayKey] = $array[$this->key()]; 
      } 
      $returnValue[] = $this->latestValues[$arrayKey]; 
     } 

     return $returnValue; 
    } 
} 

$iterator = new ValueArrayIterator($roomFloorName, $floorBuildingName); 
$newArray = iterator_to_array($iterator); 
+0

Привет, в отличие от форумов, мы не используем «Спасибо», «Любая помощь оценена» или подписи на [so], так как другие пользователи уже могут посмотреть профиль пользователя, чтобы просмотреть информацию о вас. Для получения дополнительной информации см. Раздел [Должны ли «Привет», «Спасибо», теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and- приветствия-удаляются-из-постов) и [справочный центр] (http://stackoverflow.com/help/behavior). –

0

Во-первых, вы должны определить максимальную длину массива. Затем создайте новый массив и, наконец, поместите элементы в указанном индексе в новый массив. Если индекс не соответствует границам, используйте последний элемент.

var $maxNumber = 0; 
foreach ($myArray as $array) { 
    $maxNumber = max($maxNumber, count($array)); 
} 

$result = array(); 
for ($index = 0; $index < $maxNumber; $index++) { 
    $result[] = array(); 
    foreach($myArray as $array) { 
     if (count($array) < $maxNumber) { 
      $result[$index][] = $array(count($array) - 1); 
     } else { 
      $result[$index][] = $array[$index]; 
     } 
    } 
} 
0

Предполагая, что вы хотите, чтобы подушечка неровных массивов с последним значением в массиве:

$data = ['floorBuildingName' => [..], ..]; 

// find the longest inner array 
$max = max(array_map('count', $data)); 

// pad all arrays to the longest length 
$data = array_map(function ($array) use ($max) { 
    return array_pad($array, $max, end($array)); 
}, $data); 

// merge them 
$merged = array_map(null, $data['floorBuildingName'], $data['roomFloorName']); 
Смежные вопросы