2015-03-03 2 views
2

Например есть массив:Как получить ссылку на минимальный элемент в многомерном массиве?

$data = array(
    5, 
    array(
     2, 
     8, 
     array(
      1, 
      4, 
     ), 
     3 
    ), 
); 

Как я могу найти минимальный элемент и сохранить ссылку на него? В качестве примера, когда такая операция: $data['min'] = &$data[1][2][0];

То есть, результат будет:

array { 
    [0]=> int(5) 
    [1]=> array { 
    [0]=> int(2) 
    [1]=> int(8) 
    [2]=> array { 
     [0]=> &int(1) 
     [1]=> int(4) 
    } 
    [3]=> int(3) 
    } 
    ["min"]=> &int(1) 
} 

Пробовал через array_walk_recursive, но ничего не произошло:

$min = false; 
$minLink = false; 
array_walk_recursive($data, function(&$item, $key) use (&$min, &$minLink) { 
    if ($item < $min OR !$min) { 
     $minLink = &$item; 
     $min = $item; 
    } 
}); 

ответ

2

Мое решение предполагает, что все элементы листа можно сравнить с помощью <. Я также предполагаю, что ссылка min должна храниться в исходном массиве.

array_walk_recursive($data, function (&$item) use (&$data) 
{ 
    if (!isset($data['min']) || $item < $data['min']) 
    { 
     $data['min'] = &$item; 
    } 
}); 
+1

Значит, вы предполагаете, что это было неправильное условие, а не поведение ссылки? –

+0

@TomFenech: Состояние выглядит нормально, но, похоже, невозможно правильно установить '$ minLink'. В начале каждого вызова '$ minLink' имеет значение' false'. После его установки на самом деле содержится ссылка (вы можете изменить значения '$ data' через' $ minLink'), но эта информация теряется между двумя последующими вызовами. У меня нет объяснений по этому поведению, это может быть связано с проблемами обзора? Как ни странно, моя версия работает правильно, но, как я вижу сейчас, это просто случайно ... – xmoex

Смежные вопросы