2010-11-04 10 views
0

У меня проблема в последнее время, что сводит меня с ума. У меня есть многомерный массив так:Поиск в многомерном массиве (PHP)

$a = array(
'db' => array(
    '0' => array(
     'id' => '1', 
     'name' => 'test', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ), 
    '1' => array(
     'id' => '2', 
     'name' => 'test2', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ) 
    '2' => array(
     'id' => '3', 
     'name' => 'test', 
     'cat' => array(
      'a' => '50', 
      'b' => '40', 
      'c' => '90' 
     ), 
     'canvas' => '1' 
    ) 
) 
); 

И я хочу, чтобы искать на нем, используя функцию: поиск («холст = 1»);

Это будет возвращать все массивы, ребенок дб, которые имеют ключевое полотно со значением 1. Или, например:

поиск («а = 15»);

вернуть бы все массивы, которые имеют ключ, ребенок кота, назвал и со значением 15.

+0

Что вы пытаетесь достичь в этой ситуации? У меня такое чувство, что может быть более элегантное решение, но это зависит от проблемы, которую вы пытаетесь решить. –

ответ

3
$a = array(
'db' => array(
    '0' => array(
     'id' => '1', 
     'name' => 'test', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ), 
    '1' => array(
     'id' => '2', 
     'name' => 'test2', 
     'cat' => array(
      'a' => '15', 
      'b' => '20', 
      'c' => '30' 
     ), 
     'canvas' => '2' 
    ), 
) 
); 

//checks if array $array contains element with $searchKey key, and $searchVal value 
function arrayContains($array, $searchVal, $searchKey) { 
     if (!is_array($array)) 
      return false; 
     foreach ($array as $key => $value) { 
      if ($key === $searchKey && $searchVal === $value) 
       return true; 
      if (is_array($value) && arrayContains($value, $searchVal, $searchKey)) 
       return true; 
     } 
     return false; 
    } 

function search($a, $search) { 
    list($searchKey, $searchVal) = explode('=', $search); 
    $result = array(); 
    foreach($a as $val) { 
     if (arrayContains($val, $searchVal, $searchKey)) 
      $result[] = $val; 
    } 
    return $result; 
} 

print_r(search($a['db'], "a=15")); 
print_r(search($a['db'], "canvas=1")); 

Который производит этот выход (выходы суб-массивы $ а [» дб '], которые содержат поиск пары ключей => значение):

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => test 
      [cat] => Array 
       (
        [a] => 15 
        [b] => 20 
        [c] => 30 
       ) 

      [canvas] => 2 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [name] => test2 
      [cat] => Array 
       (
        [a] => 15 
        [b] => 20 
        [c] => 30 
       ) 

      [canvas] => 2 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [id] => 3 
      [name] => test 
      [cat] => Array 
       (
        [a] => 50 
        [b] => 40 
        [c] => 90 
       ) 

      [canvas] => 1 
     ) 

) 
+0

Удивительно, спасибо. :) – JimmyNeutron

0
function search($array, $canvas) 
{ 
    $result = array(); 
    foreach ($array as $k1 => $v1) { 
     foreach ($v1 as $k2 => $v2) { 
      if ($v2['canvas'] == $canvas) { 
       $result[] = $array[$k1][$k2]; 
      } 
     } 
    } 
    return $result; 
} 

// $a = your array 
print_r(search($a, 1)); 
+0

Ваша функция, похоже, зависит от ситуации с холстом. Что, если я хочу найти a = 50? – JimmyNeutron

+0

Извините. Я внимательно прочитал вопрос. Но хороший ответ сделать @Denis. – pltvs

1

Просто проверьте ссылку ниже, если это может помочь вам - http://php.net/manual/en/function.array-search.php

Он содержит подробную документацию по функции php array_search() и различные коды пользователей для поиска в многомерном массиве наряду с обзорами пользователей.

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