ipshenicyn of delaweb
7/28/2017 - 11:02 PM

быстрая индексация массива. одна из наиболее часто используемых функций.

быстрая индексация массива. одна из наиболее часто используемых функций.

/**
 * входящий массив $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;
}