/**
* входящий массив $arr индексируется по указанному полю или хешу конкатенации полей.
* удобно использовать для последующего быстрого нахождения элементов с известным идентификатором.
*
* массив вида
* $arr = [{code:"abc",foo:"bar"},{code:"cba",foo:"rab"}]
* при вызове
* $arr = indexed($arr, "code")
* будет преобразован в
* [abc:{code:"abc",foo:"bar"},cba:{code:"cba",foo:"rab"}}
*
* параметром field может быть передан простой массив вида ["id","code"].
* в этом случае значения указанных полей конкатенируются в одну строку, вычисляется ее md5-хеш и полученнная строка бует служить ключом.
* полезно в редких случаях, когда сущность нужно "узнать" не по идентификатору а по совокупности полей
*
* @param array $arr входной массив
* @param string|array $field поле, которое будет перенесено в ключ результируещего массива (по-умолчанию "id")
* @param bool $keyToLower привести новые ключи к нижнему регистру
* @return array
*/
function indexed($arr, $field = 'id', $keyToLower = false){
$tmp = array();
//если передан массив - ключом будет md5-хеш от конкатенации полей, указанных в массиве с префиксом - именем ключа и разделителями - |
if(is_array($field)){
foreach ($arr as $key => $val) {
$hashArray = [];
for($i = 0; $i < count($field); $i++){
if($val[$field[$i]])
$hashArray[] = $field[$i].$val[$field[$i]];
}
if(!empty($hashArray)) {
$hash = implode('|', $hashArray);
$tmp[$hash] = $val;
}
}
} else {
foreach ($arr as $key => $val) {
$key = $keyToLower ? strtolower($val[$field]) : $val[$field];
$tmp[$key] = $val;
}
}
return $tmp;
}