2016-07-24 2 views
0

Ниже приведена справка о том, как выглядит мой массив. Существует внутренний массив, называемый офицерами, и я бы хотел его пропустить и проверить, есть ли сотрудник определенного имени, и если бы я хотел получить индексный ключ внешнего массива.Получить ключ 3-мерного массива

'edges' => 
    array (size=59) 
     0 => 
     array (size=3) 
      'source' => int 0 
      'target' => int 12 
      'officers' => 
      array (size=1) 
       0 => string 'PARKER, Thomas, Sir' (length=19) 
     1 => 
     array (size=3) 
      'source' => int 0 
      'target' => int 19 
      'officers' => 
      array (size=1) 
       0 => string 'STEVENS, Anne' (length=13) 

Так что, если я проверил на Стивенс, Энн, я хотел бы получить ключ 1.

Вот код, который я нашел в другом вопросе он работает с 2d массивов, но не с 3d массивом.

function array_search_inner ($array, $attr, $val, $strict = FALSE) { 
    // Error is input array is not an array 
    if (!is_array($array)) return FALSE; 
    // Loop the array 
    foreach ($array as $key => $inner) { 
    // Error if inner item is not an array (you may want to remove this line) 
    if (!is_array($inner)) return FALSE; 
    // Skip entries where search key is not present 
    if (!isset($inner[$attr])) continue; 
    if ($strict) { 
     // Strict typing 
     if ($inner[$attr] === $val) return $key; 
    } else { 
     // Loose typing 
     if ($inner[$attr] == $val) return $key; 
    } 
    } 
    // We didn't find it 
    return NULL; 
} 
+0

Я могу предложить быстрое и короткое решение, но со строгим сопоставлением. И если мы говорим о струнах, я думаю, сравнение должно быть строгим – RomanPerekhrest

ответ

0

Поскольку может быть несколько индексных ключей, которые соответствуют условию, разумно реализовать эту функцию в качестве генератора:

function getOfficerIndexKey($data, $officerName) { 
    foreach ($data['edges'] as $key => $value) { 
     in_array($officerName, $value['officers']) && (yield $key); 
    } 
} 

Теперь вы можете перебрать все найденные значения:

foreach (getOfficerIndexKey($data, 'STEVENS, Anne') as $indexKey) { 
    // Do something 
} 

Всего первых одно:

getOfficerIndexKey($data, 'STEVENS, Anne')->current();