Есть ли функция PHP для удаления любых / всех пар ключ / значение, которые имеют определенное значение из массива? - PullRequest
0 голосов
/ 22 октября 2008

Я думаю, что подобные вопросы являются причиной, почему я не люблю работать с PHP. Руководство хорошо, если вы можете найти то, что вы ищете. Прочитав Array Functions , я не увидел ту, которая обеспечивает необходимую мне функциональность.

У меня есть массив (в моем случае, с нумерацией), который я хочу отсканировать для определенного значения и, если он есть, удалить его. И затем, когда все экземпляры этого значения были удалены, я хочу переставить массив, используя array_values ​​.

Ответы [ 5 ]

6 голосов
/ 22 октября 2008

array_diff - это то, что вы хотите.

$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

Результат: "blue".

2 голосов
/ 22 октября 2008

Просто чтобы добавить к этому ...

array_diff показывает элементы в первом массиве, которые не отображаются во втором массиве. Он не показывает те элементы, которые появляются только в том или ином массиве.

например.

<?
$test = "hello";
$array1 = array("a" => "green", "red", "bicycle", "red");
$array2 = array("b" => "green", "yellow", "red", "blue", "yellow", "pink");
$result = array_diff($array1, $array2);
print_r ($result);
?> 

возвращает

Array
(
    [1] => bicycle
)
0 голосов
/ 16 февраля 2011

Перестройте эту «невозможную» функцию, я бы предложил:
function pf_cleanarray ($ arraytoclean = false, $ to_explode = false, $ delimiter = false) { / * PortalPress.org 2011 [поддержите этот комментарий, пожалуйста] - очищает массив до NULL или создает массив с содержимым; использовать с осторожностью и лучше не использовать на равных по длине в зависимости от [ассоциативных] массивов


Это выглядит ужасно, я знаю, особенно без отступа на Stackoverflow. Но при перестройке это может быть очень полезный, динамичный инструмент, использующий только самые простые функции, поэтому вы сможете по желанию манипулировать ключами и значениями на множественном массиве. Ключевой функцией является удаление пустых значений или создание массива с разнесением, это чисто, но с небольшими трудностями, его можно превратить в функцию, которая удаляет элементы в зависимости от ключа или значения. - Игорь М. -

Простой пример:
$ А [0] [0] [0] [0] [0] [0] = "А";
$ A [1] [0] [0] [0] [0] [0] = "";
$ A [2] [0] [0] [0] [0] [0] = "";
$ А [0] [0] [0] [0] [0] [1] = "";
$ A [1] [0] [0] [0] [0] [1] = "";
$ A [2] [0] [0] [0] [0] [1] = "";
$ А [0] [0] [0] [0] [0] [2] = ""; * +1014 * $ A [1] [0] [0] [0] [0] [2] = "";
$ A [2] [0] [0] [0] [0] [2] = "";
$ А [0] [0] [0] [0] [0] [3] = "";
$ A [1] [0] [0] [0] [0] [3] = "";
$ A [2] [0] [0] [0] [0] [3] = "";
$ А [0] [0] [0] [0] [0] [4] = "";
$ A [1] [0] [0] [0] [0] [4] = "";
$ A [2] [0] [0] [0] [0] [4] = ""; * * тысяча двадцать-два $ А [0] [0] [0] [0] [0] [5] = ""; * * тысяча двадцать три $ A [1] [0] [0] [0] [0] [5] = "А";
$ A [2] [0] [0] [0] [0] [5] = "";
Массив $ A: Массив ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => А [1] => [2 ] => [3] => [4] => [5] =>)))))
[1] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => [1] => [2] => [3] => [4] => [5] => А)))))
[2] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => [1] => [2] => [3] => [4] => [5] =>))))))
Результат в $ A:
Массив ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => А)))))
[1] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => А))))))
* /
if ($ arraytoclean === 0 || $ arraytoclean) {
if (! is_array ($ arraytoclean)) {
if ($ to_explode && $ delimiter) {
$ Arraytoclean = взрываются ($ разделителем, $ arraytoclean);
} else {
$ Arraytoclean = Array ($ arraytoclean);
}
}
$ NZX = 0;
$ Keyarray = array_keys ($ arraytoclean);
для ($ NYX = 0; $ NYX $ Keydigit = истина;
if ($ keyarray [$ nYx]! == $ nYx) {
$ Keydigit = ложь;
перерыв;
}
}
для ($ NYX = 0; $ NYX if (! is_array ($ arraytoclean [$ keyarray [$ nYx]]))) {
if ($ arraytoclean [$ keyarray [$ nYx]]) {
if (! isset ($ retarraytoclean)) {
$ Retarraytoclean = Array ();
}
$ retarraytoclean [(($ keydigit)? $ nZx: $ keyarray [$ nYx])] = $ arraytoclean [$ keyarray [$ nYx]];
$ NZX ++;
}
} else {
$ Temparr = pf_cleanarray ($ arraytoclean [$ keyarray [$ NYX]]); * * тысяча пятьдесят восемь if ($ temparr) {
if (! isset ($ retarraytoclean)) {
$ Retarraytoclean = Array ();
}
$ retarraytoclean [(($ keydigit)? $ nZx: $ keyarray [$ nYx])] = $ temparr;
$ NZX ++;
}
}
}
}
if (isset ($ retarraytoclean)) {
возврата ($ retarraytoclean);
} else {
вернуть (NULL);
}
}

0 голосов
/ 22 октября 2008

array_filter сделает это за вас. Вам просто нужно предоставить функцию обратного вызова фильтра:

function myFilter($Value){
   if($Value == 'red'){
      return false;
   }
   return true;
}

$Values = array("a" => "green", "red", "bicycle", "red");

$Values = array_filter($Values, 'myFilter');

возвращается:

array {
  ["a"] => "green"
  [1]   => "bicycle"
}

Функция фильтра должна возвращать true для значений, которые вы хотите сохранить, и false для тех, которые вы хотите удалить. Тогда просто продолжайте и используйте array_values, чтобы переиндексировать массив. например,

$Values = array_values(array_filter($Values, 'myFilter'));

Если вы делаете это внутри объекта и хотите вызвать метод фильтра внутри объекта, вы можете использовать эту форму для обратного вызова:

array_filter($Values, array($this,'myFilter'));
0 голосов
/ 22 октября 2008

Мне нравится функция array_diff, но у меня есть одна сценарий, если вы не хотите передавать массив:

function array_unset_value($value, &$array) {
    $key = array_search($value, $array);
    while ($key !== false) {
        unset($array[$key]);
        $key = array_search($value, $array);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...