поиск массива для соответствующей информации - PullRequest
0 голосов
/ 14 октября 2011

У меня есть массив, который выглядит следующим образом:

    Array
(
    [0] => Array
        (
            [career_overview_id] => 1
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => 
            [candidates_candidate_id] => 37
        )

    [1] => Array
        (
            [career_overview_id] => 2
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => 
            [candidates_candidate_id] => 37
        )

    [2] => Array
        (
            [career_overview_id] => 3
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => 
            [candidates_candidate_id] => 37
        )

    [3] => Array
        (
            [career_overview_id] => 4
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => voice over
            [candidates_candidate_id] => 37
        )

    [4] => Array
        (
            [career_overview_id] => 5
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => voice over
            [candidates_candidate_id] => 37
        )

    [5] => Array
        (
            [career_overview_id] => 6
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => voice over
            [candidates_candidate_id] => 37
        )

    [6] => Array
        (
            [career_overview_id] => 7
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => voice over
            [candidates_candidate_id] => 37
        )

    [7] => Array
        (
            [career_overview_id] => 8
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => voice over
            [candidates_candidate_id] => 37
        )

    [8] => Array
        (
            [career_overview_id] => 9
            [production_title] => Televison Show
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => voice over
            [candidates_candidate_id] => 37
        )

    [9] => Array
        (
            [career_overview_id] => 10
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [10] => Array
        (
            [career_overview_id] => 11
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [11] => Array
        (
            [career_overview_id] => 12
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [12] => Array
        (
            [career_overview_id] => 13
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [13] => Array
        (
            [career_overview_id] => 14
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [14] => Array
        (
            [career_overview_id] => 15
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [15] => Array
        (
            [career_overview_id] => 16
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => television
            [candidates_candidate_id] => 37
        )

    [16] => Array
        (
            [career_overview_id] => 17
            [production_title] => Production Title
            [production_role] => Role
            [production_director] => Director
            [production_company] => Production Company
            [production_producer_theartre] => 
            [production_project_type] => 
            [production_product] => 
            [production_agency] => 
            [production_type] => theartre
            [candidates_candidate_id] => 37
        )

)

Я хочу выполнить поиск в массиве, и если, например, существует production_type = "levision ", я хочу показать некоторый HTML.

Могу ли я сделать это без циклического перебора массива?

По сути, я хочу сделать следующее:

if key and value exists anywhere in array  
    do something;

В конце концов, я хочу создать список производственных_типов, но толькосписок 1 экземпляров каждого типа, если они существуют в массиве.

Ответы [ 7 ]

2 голосов
/ 14 октября 2011

Использование одного вызова собственной функции array_filter:

$tvInThere = array_filter(function ($e) {
  return isset($e['production_type']) &&  $e['production_type'] == 'television';
}, $arr) > 0;
1 голос
/ 14 октября 2011

Вы используете неправильную конструкцию для своих данных, если хотите избежать итерации массива.

//function to search the set and stop on first hit
function exists_in_set (&$set, $key, $value) {
    foreach ($set as $row) {
        if (isset($row[$key]) && $row[$key] = $value)
            return true;
    }
    return false;
}

//now for your 
//  if key and value exists anywhere in array  
//      do something;
if (exists_in_set($set, $key, $value)) {
    //do something
}

РЕДАКТИРОВАТЬ: Почему array_filter не является лучшим решением

источник: http://php.net/manual/en/function.array-filter.php

Перебирает каждое значение во входном массиве, передавая его функции обратного вызова. Если функция обратного вызова возвращает true, текущее значение из input возвращается в массив результатов. Ключи массива сохранены.

array_filter перебирает каждое значение и, следовательно, будет медленнее на больших наборах, потому что не останавливается при первом попадании.

И во-вторых, поскольку вы не хотите итерировать набор, предполагая, что это для производительности, функция анонимного обратного вызова, используемая в методе array_filter, намного медленнее, это различие более заметно в таких системах, как apc_cache, функция не может быть оптимизирована должен быть выполнен как есть во время выполнения.

1 голос
/ 14 октября 2011

Вы можете использовать функцию php array_key_exists (), чтобы определить, находится ли ключ в массиве.Точно так же функция in_array () выведет true, если значение находится в массиве.Однако эти функции не работают рекурсивно.Поэтому вам придется выполнить какой-либо цикл.

0 голосов
/ 15 октября 2011

Аналогично (но не так, как) array_filter вы можете решить общую проблему с помощью FilterIterator.

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

Итераторы могут использоваться в foreach, и они ведут себя почти так же, как массив.FilterIterator возвращает только подмножество элементов, но элементы не удаляются:

class ArrayFilterIterator extends FilterIterator
{
    private $it, $filter;
    public function __construct(array $array, $filter)
    {
        $this->it = new ArrayIterator($array);
        $this->filter = $filter;
        parent::__construct($this->it);
    }
    public function accept()
    {
        $func = $this->filter;
        return $func($this->it->current());
    }
}

$filter = function($v){ return $v['production_type'] == "television";};

$it = new ArrayFilterIterator($array, $filter);

foreach($it as $entry)
{
    print_r($entry);
}

Демо

Итераторы очень мощные, потому что вы можете легко изменитьВаш код позже, просто переключив фильтр.

0 голосов
/ 14 октября 2011

То, о чем вы говорите, требует зацикливания. В вашем псевдокоде «где угодно» - это, по сути, цикл :).

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

Если у вас есть массивы разумного размера, один цикл не убьет - так что, если вы беспокоитесь об эффективности, не беспокойтесь :).

0 голосов
/ 14 октября 2011
foreach ($infoChunk in $yourBigAssArray){
    $search1 = array_search('Television Show', $infoChunk);
    $search2 = array_search('Mr Pink', $infoChunk);
    if ($search1 && $search2 
        && $search1 =='production_title' 
        && $search2 =='production_director'
    ){
        doShiz();
    }
}

Просто еще один способ сделать то же самое ... FWIW Я бы просто зациклился, я бы подумал, что производительность будет лучше, чем в приведенном выше примере.

0 голосов
/ 14 октября 2011

Хотя есть библиотеки, которые могут сделать это, нет single , native PHP-функции для поиска в многомерном массиве.

Однако, мне кажется, вам все равно придется перебирать массив для вывода. В каком случае, в чем проблема:

foreach ($items as $item) {
  if ($item['production_type'] != 'television') {
    continue;
  }

  // output...
}

UPDATE

array_filter() работает в этом случае. Спасибо phihag .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...