2016-06-07 3 views
1

Это мой первый массив, в котором у меня есть корочки слова, которые я хочу массив:значение подстановок из массива, используя значения из другого массива

$needlearray = (0 => 12421, 1 => 58902, 2 => 912, 3 => 42); 

Тогда второй массив содержит все слова с данными слов :

$haystackarray = (
0 => array('id' => 42, 'word' => "hello", 'otherdata' => "other"), 
1 => array('id' => 12421, 'word' => "good", 'otherdata' => "other"), 
2 => array('id' => 58902, 'word' => "hello", 'otherdata' => "other"), 
3 => array('id' => 5222, 'word' => "hello", 'otherdata' => "other"), 
4 => array('id' => 912, 'word' => "hello", 'otherdata' => "other"), 
5 => array('id' => 43290, 'word' => "hello", 'otherdata' => "other"), 
6 => array('id' => 2312, 'word' => "hello", 'otherdata' => "other") 
); 

Я хочу вывести в самый быстрый из возможных способов, используя значение $needlearray взгляд от $haystackarray как «идентификатор». например выход я хотел бы, используя пример выше:

$result = (
0 => array('id' => 12421, 'word' => "good", 'otherdata' => "other"), 
1 => array('id' => 58902, 'word' => "hello", 'otherdata' => "other"), 
2 => array('id' => 912, 'word' => "hello", 'otherdata' => "other"), 
3 => array('id' => 42, 'word' => "hello", 'otherdata' => "other"), 
); 

Примечание:

  • В настоящее время я использую foreach цикл с поиском массива. Это очень медленно.
  • Необходимо сохранить первоначальный заказ $needlearray.
  • Фактические данные могут содержать несколько тысяч значений в $needlearray, а также несколько тысяч массивов в $haystackarray.
  • Скорость очень важна, так как это часть большого процесса.
+0

Итак, что ты хотел, чтобы мы сделали здесь? –

+2

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

+2

'$ filter = array_intersect_key ($ haystackarray, array_intersect (array_column ($ haystackarray, 'id'), $ needlearray));' если вам нужно это делать в PHP –

ответ

0

Вы действительно хотите сделать это в базе данных. Вы бы сделать что-то вроде этого:

$list = implode(',', $needlearray); 

$query = "SELECT id, word, otherdata FROM table 
       WHERE id IN($list) 
       ORDER BY FIELD(id, $list)"; 
  • Получить строки, где id находится в списке
  • заказа по id в списке заказа

Если вам нужно сделать это в PHP, то это может или не может быть быстрее, чем foreach():

$result = array_intersect_key(array_column($haystackarray, null, 'id'), 
           array_flip($needlearray)); 
  • Индекс стог по id
  • Флип иглы, чтобы получить значение в качестве индекса
  • Найти пересечение (общие ключи)

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

+0

Спасибо, я запросил базу данных, используя ORDER BY FIELD, и она отлично работает :) – Carl

+0

Я только заметил, что когда я выполняю запрос, он получает только уникальные значения. сам запрос $ query является правильным. Есть ли способ запросить базу данных и включить дубликаты? – Carl

0

Вы можете использовать функцию array_intersect.

<?php 
    $needlearray = [0 => 12421, 1 => 58902, 2 => 912, 3 => 42]; 
    $haystackarray = [ 
    0 => array('id' => 42, 'word' => "hello", 'otherdata' => "other"), 
    1 => array('id' => 12421, 'word' => "good", 'otherdata' => "other"), 
    2 => array('id' => 58902, 'word' => "hello", 'otherdata' => "other"), 
    3 => array('id' => 5222, 'word' => "hello", 'otherdata' => "other"), 
    4 => array('id' => 912, 'word' => "hello", 'otherdata' => "other"), 
    5 => array('id' => 43290, 'word' => "hello", 'otherdata' => "other"), 
    6 => array('id' => 2312, 'word' => "hello", 'otherdata' => "other") 
]; 
    $result = array_intersect_key($haystackarray, array_intersect(array_column($haystackarray, 'id'), $needlearray)); 
    echo "<pre>"; 
    print_r($result);exit(); 

WORKING DEMO

+1

, к сожалению, это не поддерживает первоначальный заказ $ needlearray. – Carl

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