2016-04-13 3 views
5

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

Id = "ADA001" 
    Stock: 15 

Массив имеет около 1700 записей, выглядит так же, как бы я искать массив для ID 1 и вернуть акции?

Edit: мне нужно будет получить доступ к акции каждого из этих 17000 записей

Edit: Я получал некоторую помощь от Daniel Centore, он сказал мне, чтобы установить массивы первичного ключа id элемента и что он равен запасу, но я не могу заставить его работать.

В настоящее время я получаю данные из базы данных MySQL и хранить его в массив, например, так:

 $data[] = array(); 
    $getdisposabletest = mysqli_query($connect, "Select id, disposable FROM products");  

while ($z = mysqli_fetch_array($getdisposabletest)) { 
    $data = $z; 
} 

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

$myMap = []; 
foreach($data as $item) { 
    $myMap[$item['id']] = $item['disposable']; 
} 

Она не возвращает ничего, когда я пытаюсь повторить свой продукт с ID «ADA001»

echo $myMap["ADA001"]; 

Кроме того, когда я «count ($ mymap)», он говорит, что его 2 записи большие, когда это должно быть больше, чем это?

Спасибо за помощь

+0

Вы бы разделили немного больше структуры массива –

+0

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

+0

Используйте 'array_filter (...)' http://php.net/manual/en/function.array-filter.php, и если вы уверены, что идентификаторы уникальны, используйте 'current (array_filter (...)) ', чтобы вернуть первую запись. – Anton

ответ

0

Вы бы сделали что-то подобное.

$newArray=[]; 
foreach($array as $item){ 
    if($item['Id'] === 1){ 
     $newArray[] = $item; 
    } 
} 
$stockArray = array_column($newArray,'Stock'); 
+0

Я бы, конечно, использовал '===', если тестирование для 1 или 0. – DevDonkey

+0

Я не знаю, является ли 1 строкой или целым числом – Neoaptt

+1

для массива из 1700 записей. Я бы предложил сделать id ключом для массива –

3

Я бы использовал array_filter. Верните результат сравнения.

$results = array_filter($targetArray, function($el) { 
    return $el === 1; 
}); 
1

Edit: Теперь, когда стало ясно, что ОП хочет запросить из тысяч элементов, правильный способ сделать это, чтобы сделать Id ключ к карте в PHP, как это :

$myMap = []; 
foreach($array as $item) { 
    $myMap[$item['Id']] = $item['Stock']; 
} 

Теперь, когда вы хотите получить доступ к элементу '12', просто используйте $myMap['12'].

Причина, по которой это происходит быстрее из-за того, что называется алгоритмической сложностью. Вы должны прочитать о нотации Big-O для получения дополнительной информации. По сути, первая операция здесь составляет порядка n, а затем цикл через каждый из выходящих предметов составляет порядка n*log(n), поэтому конечный результат составляет n*log(n), что является лучшим, что вы сможете делать без дополнительной информации. Однако, если бы вы имели доступ только к одному элементу, доступ к этому одному элементу через MySQL был бы лучше, потому что он был бы порядка log(n), что быстрей.

Edit 2: заметить также, что если вы должны были получить доступ к mutliple полей (т.е. не только акции), вы можете сделать следующее:

$myMap = []; 
foreach($array as $item) { 
    $myMap[$item['Id']] = $item; 
} 

И просто доступ пункт 12 в акции, как это: $myMap['12']['stock'] или его название: $myMap['12']['name'].

+0

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

+0

Этот способ более эффективен, если позволяет сказать, что у меня есть 2000 продуктов, и мне нужно получить запас каждого элемента? Будет ли запрос к базе данных снова и снова быть эффективным? – user2750279

+0

Нет, это не было бы более эффективным. Проясните, что это то, что вы хотите сделать в вопросе, и я буду обновлять свой ответ с правильным. –

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