PHP - поиск в многомерном массиве

у меня сильно болит голова, подскажите. У меня следующая ситуация:

  • у меня есть следующий многомерный массив:

    $numbers = array (
        "one_digit" => array (1,2,3,4,5),
        "two_digits" => array (20,21,22,23,24,25),
        "three_digits" => array (301,302,303,304,304),
        "mixed_digits" => array (9,29,309,1)
    );
    
  • мне нужен способ поиска в массиве $numbers следующего:

    -- поиск, если число 20 находится в любом массиве $numbers, и эхо, где оно найдено ex. $find1 = m_array_search("20", $numbers); echo "Я нашел искомое значение в подмассиве ".$find1." массива $numbers"; результат: "я нашел искомое значение в подмассиве two_digits $numbers"

    -- поиск, если номер 1 находится в каком-либо массиве $numbers, и эхо, где он найден, например. $find2 = m_array_search("1", $numbers); echo "Я нашел искомое значение в подмассиве ".$find2." массива $numbers"; результат: "я нашел искомое значение в подмассиве two_digits,mixed_digits из $numbers"

таким образом, функция должна иметь возможность обнаруживать присутствие в одном или нескольких «подмассивах». извините, если я пропустил термин "подмассив"

БЛАГОДАРЮ ВАС!!!


person Bogdan Webb    schedule 09.11.2016    source источник


Ответы (3)


Вы можете попробовать это с помощью array_search() в цикле -

$numbers = array (
    "one_digit" => array (1,2,3,4,5),
    "two_digits" => array (20,21,22,23,24,25),
    "three_digits" => array (301,302,303,304,304),
    "mixed_digits" => array (9,29,309,1)
);

function search_value($array, $value)
{
  $result = array();
  foreach($array as $key => $sub) {
    // check if element present in sub array
    if(array_search($value, $sub) !== false) {
      // store the key
      $result[] = $key;
    }
  }
  return $result;
}

var_dump(search_value($numbers, 1));
var_dump(search_value($numbers, 5));

Вывод

array(2) {
  [0]=>
  string(9) "one_digit"
  [1]=>
  string(12) "mixed_digits"
}
array(1) {
  [0]=>
  string(9) "one_digit"
}
person Sougata Bose    schedule 09.11.2016

Простое решение с использованием функции in_array:

$search = 1;
$keys = [];
foreach ($numbers as $k => $v) {
    if (is_array($v) && in_array($search, $v)) $keys[] = $k;
}

echo "I've found the searched value in ". implode(', ', $keys) ." subarray". ((count($keys) > 1)? "s":"") ." of \$numbers";

Выход:

I've found the searched value in one_digit, mixed_digits subarrays of $numbers
person RomanPerekhrest    schedule 09.11.2016
comment
@BogdanWebb, это лучший ответ на странице (вы можете опустить проверку is_array(), я бы так и сделал). array_search() является излишним, когда вам нужен только истинный/ложный результат от каждой проверки подмассива. Вы можете пересмотреть свое решение. - person mickmackusa; 13.01.2018

Проверьте это и дайте мне знать, если это поможет вам.

<?php
function array_find_deep($array, $search, $keys = array())
{
    foreach($array as $key => $value) {
        if (is_array($value)) {
            $sub = array_find_deep($value, $search, array_merge($keys, array($key)));
            if (count($sub)) {
                return $sub;
            }
        } elseif ($value === $search) {
            return array_merge($keys, array($key));
        }
    }

    return array();
}


$numbers = array (
    "one_digit" => array (1,2,3,4,5), 
    "two_digits" => array (20,21,22,23,24,25),
    "three_digits" => array (301,302,303,304,304),
    "mixed_digits" => array (9,29,309,1)
);

var_dump(array_find_deep($numbers, 20));

var_dump(array_find_deep($numbers, 1));

var_dump(array_find_deep($numbers, 301));

var_dump(array_find_deep($numbers, 309));

?>

Вы можете сохранить результат в переменной, такой как $result = array_find_deep($numbers, 20);, и попробовать echo $result[0], которая даст результат, в котором массив нашел значение.

person Punit Gajjar    schedule 09.11.2016