mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 12:12:34 +03:00
fixed #475
This commit is contained in:
78
SQF/dayz_code/compile/BIS_fnc/fn_findNestedElement.sqf
Normal file
78
SQF/dayz_code/compile/BIS_fnc/fn_findNestedElement.sqf
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
scriptName "Functions\arrays\fn_findNestedElement.sqf";
|
||||||
|
/*
|
||||||
|
File: fn_findNestedElement.sqf
|
||||||
|
Author: Joris-Jan van 't Land
|
||||||
|
|
||||||
|
Description:
|
||||||
|
Function to find item in nested arrays and return a path to the first match.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
_array = [[1, 2], [3, 4]];
|
||||||
|
_path = [_array, 3] call BIS_fnc_findNestedElement; //Expected result: [1, 0]
|
||||||
|
|
||||||
|
Parameter(s):
|
||||||
|
_this select 0: Array
|
||||||
|
_this select 1: queried element (Any Value)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Array path to the element
|
||||||
|
*/
|
||||||
|
|
||||||
|
private ["_array", "_query", "_path", "_found"];
|
||||||
|
_array = _this select 0;
|
||||||
|
_query = _this select 1;
|
||||||
|
_path = [];
|
||||||
|
_found = false;
|
||||||
|
|
||||||
|
//Parameter checking.
|
||||||
|
if ((typeName _array) != (typeName [])) exitWith {debugLog "Log: [findNestedElement] Array (0) should be an Array!"};
|
||||||
|
|
||||||
|
//Find a value in an Array or one of its children.
|
||||||
|
private ["_searchArrayFunc"];
|
||||||
|
_searchArrayFunc =
|
||||||
|
{
|
||||||
|
private ["_array", "_query", "_find"];
|
||||||
|
_array = _this select 0;
|
||||||
|
_query = _this select 1;
|
||||||
|
|
||||||
|
//See if the array itself contains the queried element.
|
||||||
|
_find = _array find _query;
|
||||||
|
if (_find != -1) exitWith
|
||||||
|
{
|
||||||
|
_path = _path + [_find];
|
||||||
|
_found = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
//If not, search its children.
|
||||||
|
[_array, _query] call _searchArrayChildrenFunc;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Find a value in an Array's children.
|
||||||
|
private ["_searchArrayChildrenFunc"];
|
||||||
|
_searchArrayChildrenFunc =
|
||||||
|
{
|
||||||
|
private ["_array", "_query"];
|
||||||
|
_array = _this select 0;
|
||||||
|
_query = _this select 1;
|
||||||
|
|
||||||
|
//Search all Array children for the queried element.
|
||||||
|
for "_i" from 0 to ((count _array) - 1) do
|
||||||
|
{
|
||||||
|
private ["_sub"];
|
||||||
|
_sub = _array select _i;
|
||||||
|
|
||||||
|
if (((typeName _sub) == (typeName [])) && !_found) then
|
||||||
|
{
|
||||||
|
_path = _path + [_i];
|
||||||
|
[_sub, _query] call _searchArrayFunc;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if(count path > 0)then{
|
||||||
|
//Nothing was found, so take a step back.
|
||||||
|
if (!_found) then {_path resize ((count _path) - 1)};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
[_array, _query] call _searchArrayFunc;
|
||||||
|
|
||||||
|
_path
|
||||||
Reference in New Issue
Block a user