2015-01-10 2 views
0

если есть массив PHP, как это:массива уникального значения изменения

$arr = array(
    array('tree' => array('apple', 'pear', 'quantity' => 1)), 
    array('house' => array('door', 'window', 'quantity' => 1)), 
    array('house' => array('door', 'window')), 'quantity' => 1)), 
); 

Что я хочу добиться того, что если есть повторяющееся значение количество получает увеличивается и повторяющееся значение будет удалено.

Любое решение?

+0

Можете ли вы привести пример, как он должен выглядеть? –

+0

Вы могли бы объяснить немного больше? вы хотите 'cal_your_function ($ arr)' вернуть только две строки в этом конкретном случае? какая строка мачты будет удалена? Второй? Третий? любой второй или третий? дайте нам больше информации, пожалуйста, больше примеров? – Alex

ответ

0

Другой подход:

 $res2 = array(); 
     foreach ($arr as $n) { 
      $key = key($n); 
      (!isset($res2[$key])) ? 
       $res2[$key] = $n[$key] : 
       $res2[$key]["quantity"] += $n[$key]["quantity"]; 
     } 
     print_r($res2); 

UPDATE

Это должно сделать трюк для новых требований:

$new_array = array(); 
foreach ($arr as $key => $value) { 
    $new_array[$key] = json_encode($value);// Transform to string to be able to use array_count_values 
} 

$res = array(); 
$repeated = array_count_values($new_array); 
foreach ($repeated as $val => $c) { 
    $key = array_search($val, $new_array);// It will find the first one. 
    $res[$key] = $arr[$key]; 
    $res[$key]["quantity"] = $c; 
} 

print_r($res); 
+0

@CorvanOostenbrugge в чем проблема? – acontell

+0

@CorvanOostenbrugge, пожалуйста, проверьте обновление, я думаю, он будет работать – acontell

+0

Он делает, большое вам спасибо! –

1

Вы можете начать, взглянув на array_reduce. Ниже приведен пример кода, который может начаться с . Поскольку вы еще не полностью описали ожидаемый результат, приведенный ниже код демонстрирует только то, что я мог бы сделать из него.

Примечание: Я вижу много краевых случаев в том, как у вас есть структура данных. Например: что, если первый элемент массива содержит несколько записей? Как бы вы объединили его в таком случае?

<?php 

$arr = array(
    array('tree' => array('apple', 'pear', 'quantity' => 1)), 
    array('house' => array('door', 'window', 'quantity' => 1)), 
    array('house' => array('door', 'window', 'quantity' => 1)), 
); 

$res = array_reduce($arr, function($state, $item){ 
    foreach($item as $key => $value) { 
     if (isset($state[$key])) { 
      $state[$key]['quantity']++; 
     } else { 
      $state[$key] = $value; 
     } 
    } 
    return $state; 
}); 

var_dump($res) 
?> 

Выход:

array(2) { 
    ["tree"]=> array(3) { 
     [0]=> string(5) "apple" 
     [1]=> string(4) "pear" 
     ["quantity"]=> int(1) 
    } 
    ["house"]=> array(3) { 
     [0]=> string(4) "door" 
     [1]=> string(6) "window" 
     ["quantity"]=> int(2) 
    } 
} 
Смежные вопросы