Вам не нужно вкладывать петли. 1 foreach
достаточно. Проверьте значения в $item
$data = array(array("label" => "Customer_Info",
"data" => "10"),
array("label" => "Customer_Other",
"data" => "50"));
$line = '';
foreach ($data as $item)
{
if (isset($item['label'])
&& isset($item['data'])
&& $item['label'] == 'Customer_Info')
{
$line .= "data: {$item['data']}, ";
}
}
$current = rtrim($line, ', ')."\n";
echo $current;
Вывод:
данные: 10
blockquote>
В чистом C/C++ в Windows начните читать о функции DragAcceptFiles и сообщении WM_DROPFILES. Если Вы пользуетесь более мощной библиотекой C++ (QT, Wx, и т.д.) проверяют их соответствующую документацию. Это помогло бы знать то, что Вы используете, более конкретно.
Кроме того, это обсуждение может ответить на Ваш вопрос. Если это - то, что Вы имели в виду, понравитесь близко этому вопросу.
редактирование после того, как я отправил это, вопрос, было отредактировано для квалификации как C++; я собираюсь оставить этот ответ здесь для ссылки только.
"какой вид от кодирования входит в приложение":
Это зависит чрезвычайно от платформы и языка. Например, вот примеры для Windows через C#/.NET или VB/.NET. Для C++, Delphi, и т.д. - приемы будут отличаться.
Необходимо использовать интерфейсы Перетаскивания Ole COM.
Передо днями OLE/COM/ActiveX мы сделали бы что-то как следующее:
Примечание: ни одно из этого не позволило бы Вам объектам перетаскивания между приложениями, только в отдельных приложениях.
Почти для какого-либо вопроса как, "Как я делаю эту вещь UI?"
Мой ответ всегда: "Используйте wxWidgets".
Hugo
С com:
Создайте класс, который общедоступно расширяет IDropTarget
Зарегистрируйте свой класс для отбрасывания. Сделайте это в WM_CREATE
RegisterDragDrop(hwnd,static_cast<IDropTarget*>(pointer_to_your_class));
. В вашем классе вам нужно переопределить пару функций, поскольку они являются чисто виртуальными:
virtual HRESULT STDMETHODCALLTYPE DragEnter(
/* [unique][in] */ __RPC__in_opt IDataObject *pDataObj,
/* [in] */ DWORD grfKeyState,
/* [in] */ POINTL pt,
/* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;
virtual HRESULT STDMETHODCALLTYPE DragOver(
/* [in] */ DWORD grfKeyState,
/* [in] */ POINTL pt,
/* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;
virtual HRESULT STDMETHODCALLTYPE DragLeave( void) = 0;
virtual HRESULT STDMETHODCALLTYPE Drop(
/* [unique][in] */ __RPC__in_opt IDataObject *pDataObj,
/* [in] */ DWORD grfKeyState,
/* [in] */ POINTL pt,
/* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;
Каждая из этих функций будет вызываться при возникновении этих событий, то есть когда кто-то проведет мышью в вашем окне с Будет вызван файл DragEnter в вашем классе.
Вам также потребуется реализовать еще пару функций, которые расширяет IDropTarget, проверьте IUnknown в вашем MSDN.
Затем вам нужно запросить параметр IDataObject, чтобы получить данные:
FORMATETC fdrop = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
if (SUCCEEDED(pDataObj->QueryGetData(&fdrop)) ){
STGMEDIUM stgMedium = {0};
stgMedium.tymed = TYMED_HGLOBAL;
HRESULT hr = pDataObj->GetData(&fdrop, &stgMedium);
if (SUCCEEDED(hr))
{
HGLOBAL gmem = stgMedium.hGlobal;
HDROP hdrop = (HDROP)GlobalLock(gmem);
UINT numOfFiles = DragQueryFile( (HDROP) hdrop,
0xFFFFFFFF,
NULL,
0
);
TCHAR buffer[MAX_PATH];
for( int i=0;i<numOfFiles;i++ ){
UINT charsCopied = DragQueryFile( (HDROP) hdrop,
i,
buffer,
MAX_PATH
);
MessageBox(NULL,buffer,_T("Archivos a copiar: "),MB_OK);
}
// use str
GlobalUnlock(gmem);
/*TCHAR* str = (TCHAR*)GlobalLock(gmem);
// use str
GlobalUnlock(gmem);*/
::ReleaseStgMedium(&stgMedium);
}
}
Ура!