этот другой подход с использованием функционального программирования
<?php
$data = json_decode('[
{
"id": 1,
"value1": 5,
"value2": 10
},
{
"id": 2,
"value1": 50,
"value2": 100
},
{
"id": 1,
"value1": 1,
"value2": 2
},
{
"id": 2,
"value1": 15,
"value2": 20
},
{
"id": 3,
"value1": 15,
"value2": 20
}
]');
//print_r(array_group_by($data,'id'));
print_r(array_sum_by($data,'id',['value1','value2']));
//print_r(array_sum(array_column($data,'value1')));
function array_sum_by($array,$group,$keys)
{
$groupeddata = array_group_by($array,$group);
return array_map(function($items) use($group,$keys) {
foreach($keys as $key)
{
$values[$key] = array_sum(array_column($items,$key));
}
$first = array_shift($items);
if(is_object( $first ) && isset( $first->{ $group } )){
$values = array_merge([ $group => $first->{ $group } ], $values);
}elseif(isset($first[$group])){
$values = array_merge([ $group => $first[$group] ], $values);
}
return $values;
},$groupeddata);
}
function array_group_by( array $array, $key )
{
if ( ! is_string( $key ) && ! is_int( $key ) && ! is_float( $key ) && ! is_callable( $key ) ) {
trigger_error( 'array_group_by(): The key should be a string, an integer, or a callback', E_USER_ERROR );
return null;
}
$func = ( is_callable( $key ) ? $key : null );
$_key = $key;
// Load the new array, splitting by the target key
$grouped = [];
foreach ( $array as $value ) {
if ( is_callable( $func ) ) {
$key = call_user_func( $func, $value );
} elseif ( is_object( $value ) && isset( $value->{ $_key } ) ) {
$key = $value->{ $_key };
} elseif ( isset( $value[ $_key ] ) ) {
$key = $value[ $_key ];
} else {
continue;
}
$grouped[ $key ][] = $value;
}
// Recursively build a nested grouping if more parameters are supplied
// Each grouped array value is grouped according to the next sequential key
if ( func_num_args() > 2 ) {
$args = func_get_args();
foreach ( $grouped as $key => $value ) {
$params = array_merge( [ $value ], array_slice( $args, 2, func_num_args() ) );
$grouped[ $key ] = call_user_func_array( 'array_group_by', $params );
}
}
return $grouped;
}
Почему не всего #include
сгенерированные заголовки создаются от #import
?
(Я немного опаздываю к этому вопросу, но это - проблема, близкая и дорогая для моей основы.)
Вы могли попытаться использовать олдскульный способ получить доступ к COM-объектам от C/C++. Это вовлекает разработчиков COM-объектов, обеспечивающих клиентские.h файлы, которые имеют версии C/C++ COM-интерфейсов. Эти файлы похожи на более простые версии того, что делает #import.
, Куда эти файлы прибывают из? Если COM-объекты записаны в C/C++ (VC ++), чем они прибывают из компилятора MIDL. Этот инструмент командной строки берет файлы ODL/IDL и создает исходный код C/C++ из них. Часть из того, что это испускает, полезна для клиентского приложения.
, Если у Вас есть источник COM-объектов, у Вас могут уже быть эти файлы!
, Если у Вас только есть файлы TLB, можно использовать Средство просмотра OLE/COM-объекта (OLEVIEW.exe - шел, по крайней мере, с VC ++ 6.0), Вы открываете библиотеку типов и сохранить Как и СТАРЫЙ файл / файл IDL. Тогда работайте, компилятор MIDL для генерации клиентского C/C++ включают файлы. Существует ничтожный шанс, что сторонний COM-объект может идти с этими файлами, но они часто не делают (я вспоминаю, что Crystal Reports сделал некоторое время, затем прекратил поставлять их - завинчивание нас по-царски - но я отступаю).
Используя интеллектуальные указатели ATL (и другие классы поддержки) с интерфейсными классами MIDL создает, почти в хорошем как, что создает #import. Это зависит от того, сколько из #import-specific функций Вы используете.
Для / MP я сделал и что я предлагаю и часть из того, что предлагает принятый ответ Matt Davison.
Одна опция состоит в том, чтобы переместить импорт в отдельный DLL и предоставить классы обертки им использующий непрозрачный указатель. Тогда отключите / MP для того DLL только, и остальная часть Вашей сборки должна быть прекрасной.
Вы могли разделить проект на две части, та, которая более или менее делает импорт, отключающий / MP и тот, который делает все остальное включающее / MP.
http://msdn.microsoft.com/en-us/library/bb385193.aspx
мс говорит, что это не совместимо
Вы можете использовать параметр / MP для всего проекта, а затем сделать исключение для отдельного файла с помощью параметра / MP1 .