2016-06-03 3 views
0

было интересно, если Theres способ фильтровать массивы в PHP с помощью делать что-то вроде этого:Фильтрация массивов в PHP по параметру

if (!in_array("something",$something) 

Теперь я хотел бы получить все значения, которые НЕ подкреплялись критерий поиска.

Например, если у меня есть массив как это:

$options = array("Preview", "Live", "Completed"); 

и я передать значение для поиска: «Предварительный просмотр», я хотел бы, чтобы вернуть эти два элемента в массиве «Live» и " Завершено "в результате моей фильтрации массивов ...

Есть ли способ, которым я мог это сделать?

Edit:

У нас есть начальный массив так:

$options = array("Preview", "Live", "Completed"); 

Первоначальный ввод в поисках массива "Preview" строка.

Выходной массив, который я хотел бы, чтобы это было это:

$newArray = array("Live", "Completed"); 

EDIT EDIT (ЧЕГО IM ДЕЙСТВИТЕЛЬНО ПЫТАЮТСЯ ДОБИТЬСЯ):

Привет, ребята, это то, что я на самом деле пытается сделать :

<?php foreach($active_brand as $brand?> 
<select> 
          <?php if (in_array($brand['State'], $options)) { ?> 
           <option selected="selected" value="<?=$brand['id']?>"><?=$brand['State']?></option> 
          <?php }?> 
          <?php for($i=1;$i<count($options);$i++) { ?> 
           <option value="<?=$brand['id']?>"><?=array_diff($options, array($brand['State']))[$i]?></option> 
          <?php }?> 
         </select> 
<?php }?> 

Как вы можете видеть, ребята, у меня есть столбец в моей БД, которая называется «государство» ... Это в основном VARCHAR, где я держу мои строки хранятся ... Марка состояние может быть только 3 следующих состояния:

Preview => Live => Completed 

Первое, что я сделать, это установить текущее значение для выбора списка, как следующее:

<?php if (in_array($brand['State'], $options)) { ?> 
            <option selected="selected" value="<?=$brand['id']?>"><?=$brand['State']?></option> 
           <?php }?> 

Теперь я определил массив, как это в моем файле PHTML так:

$options = array("Preview", "Live", "Completed"); 

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

<?php for($i=1;$i<count($options);$i++) { ?> 
          <option value="<?=$brand['id']?>"><?=array_diff($options, array($brand['State']))[$i]?></option> 
         <?php }?> 

Так что структура в моем списке выбора, как следующее:

Текущее состояние бренд => defaultly выбрано => добавить два отсутствующие состояния, чтобы выбрать список (но не добавить текущий, который установлен в DB) ...

Может кто-нибудь помочь мне?

+0

Можете ли вы добавить «пример ввода» и «пример вывода»? – Will

+0

Привет, я отредактировал свой вопрос, можете ли вы заглянуть в него сейчас? – perkes456

+0

Пожалуйста, покажите нам, что вы уже пробовали и что не работает –

ответ

2

Вы можете использовать array_diff:

$notIn = array_diff($options, array('Preview')); 

Хорошая вещь об этом является то, что вы можете выбирать с несколькими значениями, если вам нужно.

Update:

Я думаю, немного будет более понятно, чтобы сделать следующее:

<?php foreach($active_brand as $brand) { ?> 
<select> 
    <?php foreach($options as $option) { ?> 
     <option <?php if($brand['State'] == $option) { ?>selected="selected"<?php } ?> value="<?=$brand['id']?>"><?php echo $option; ?></option> 
    <?php } ?> 
</select> 
<?php } ?> 
+0

Есть ли способ получить одно значение, которое не совпадает с критерием поиска при выполнении цикла for в одно и то же время? Это похоже на действительно хорошее решение, просто отсутствует то, что я написал здесь ... Можно ли это сделать? – perkes456

+0

Можете ли вы дать более подробную информацию о том, что вам нужно. Я не совсем понимаю. Кроме того, обновите свой вопрос с помощью этой информации, потому что приведенный выше код делает именно то, что вы описали: $ options = array («Preview», «Live», «Completed»); -> $ newArray = array («Live», «Completed»); с поиском критерий «Предварительный просмотр» – xjmdoo

+0

Привет, я отредактировал свой вопрос ... Можете ли вы заглянуть в него, пожалуйста? – perkes456

0

Try:

function removeAllValuesMatching(array $arr, $value) { 
    $keys = array_keys($arr, $value); 
    foreach ($keys as $key) { 
     unset($arr[$key]); 
    } 
    return $arr; 
} 

$options = array("Preview", "Live", "Completed"); 

removeAllValuesMatching($options, "Preview"); // pass array and value to match 
0

Вы можете использовать array_filter()

$array = array('Preview', 'Live', 'Completed'); 
$blacklist = 'Preview'; 
$result = array_filter($array, function($value) use ($blacklist) { 
    if($value !== $blacklist){ 
     return $value; 
    } 
}); 
var_dump($result); 
exit; 

Вы можете настроить он, поэтому $ blacklist может быть массивом, если вам нужно.

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