2014-01-12 3 views
-5

У меня такой массив.Комбинация массива с пользовательским стилем

Array 
(
    [0] => Array 
     (
      [supplierID] => 1 
      [parkTypeID] => 1 
      [cost] => 17 
     ) 

    [1] => Array 
     (
      [supplierID] => 2 
      [parkTypeID] => 1 
      [cost] => 65 
     ) 

    [2] => Array 
     (
      [supplierID] => 2 
      [parkTypeID] => 2 
      [cost] => 30 
     ) 

) 

Я хочу комбинировать элементы, имеющие такое же значение для идентификатора поставщикаID, как это. Каждое значение имени ключа задается в ключах нового массива.

Array 
(
    [1] => Array 
     (
      [1] => 17 
     ) 

    [2] => Array 
     (
      [1] => 65 
      [2] => 30 
     ) 

) 
+2

Пытались ли вы что-нибудь, чтобы решить вашу проблему? Решение так же просто, как один 'foreach' – zerkms

+0

Я попытался с array_map(). Но не повезло. Это так просто? – Namal

+0

какой результат вы хотите ?? –

ответ

1

Попробуйте

$r = array(); 
foreach ($array1 as $x) { 
    if (array_key_exists($x['supplierID'], $r) 
    $r[$x['supplierID']][$x['parkTypeID']] = $x['cost']; 
    else  
    $r[$x['supplierID']] = array($x['parkTypeID'] => $x['cost']); 
} 

Это будет перебирать исходный массив $array1 и создать новый массив $r с нужной информацией.

Для каждого элемента в исходном массиве мы проверяем, существует ли supplierID в $r.

Если это так, мы просто добавляем новую корреляцию между parkTypeID и cost к существующим значениям.

Если нет, то мы добавим к supplierID$r и присвоить ему массив только с этой парой parkTypeID и cost.


упрощенная версия приведенного выше кода, который опирается на PHP, чтобы инициализировать отключенное индекс массива в пустой массив, если необходимо, это

$r = array(); 
foreach ($array1 as $x) 
    $r[$x['supplierID']][$x['parkTypeID']] = $x['cost']; 
+0

Ваше решение потеряет некоторые данные – zerkms

+0

вы только что отредактировали! – aggelgian

+0

Вы можете значительно улучшить свой ответ, объяснив, как это работает. – Charlie

0
$arr_res = array_reduce($arr, function($t, $v) { 
    if (!isset($t[$v['supplierID']])) 
     $t[$v['supplierID']] = array(); 

    $t[$v['supplierID']][] = $v['cost']; 
    return $t; 
} , array()); 
+1

На самом деле ваша проверка 'if' не требуется. '[]' будет создавать массив, если он еще не существует без уведомлений. PS: решение 'array_reduce' фактически может быть вредным для новичка – zerkms

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