За последние 24 часа нас посетили 73716 программистов и 10145 роботов. Сейчас ищут 2786 программистов ...

Удалить лишние элементы массива

Тема в разделе "PHP для новичков", создана пользователем Огонек, 21 июл 2017.

  1. Огонек

    Огонек Новичок

    С нами с:
    21 июл 2017
    Сообщения:
    7
    Симпатии:
    1
    Здравствуйте.
    Пытаюсь решить такую задачу:
    Исходные данные 2 массива и переменная:
    массив 1
    PHP:
    1. $results = array(
    2. array("id_state" => 0,
    3.            "name" => "Имя 0"),
    4. array("id_state" => 1,
    5.            "name" => "Имя 1"),
    6. array("id_state" => 2,
    7.            "name" => "Имя 2"),
    8. array("id_state" => 3,
    9.            "name" => "Имя 3"),
    10. ...
    11. );
    массив 2
    PHP:
    1. $results_needed = array(
    2. array("id_curr_state" => 0,
    3.            "id_needed" => 1),
    4. array("id_curr_state" => 0,
    5.            "id_needed" => 3),
    6. array("id_curr_state" => 2,
    7.            "id_needed" => 3),
    8. );
    переменная
    PHP:
    1. $id_current_state = 1;
    Необходимо в массиве 1 оставить только те элементы, которые удовлетворяют любому из двух условий (не удовлетворяющие нужно удалить):
    - если значения $id_current_state нет среди значений id_curr_state из массива 2, то удалять ничего не надо
    - если значение $id_current_state есть среди значений id_curr_state из массива 2, то оставить нужно те значения, у которых
    PHP:
    1. $results_needed[][id_needed] == $result[id_state] and $results_needed[][id_curr_state] == $id_current_state
    Т.е. для $id_current_state = 1 - оставить все
    для $id_current_state = 0 - оставить id_state = 1 и 3
    для $id_current_state = 2 - оставить id_state = 3

    Мои тщетные потуги за кончились на этом:

    PHP:
    1. foreach ($results as $result) {
    2.  
    3. }
    Поиск привел к использованию array_keys(), array_values(), array_key_exists(), и in_array().
    Но как их использовать в случае вложенных массивов чего-то я не понял.
    Прошу помощи
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Я запутался в задании, когда всё прочитал.

    Т.е. для $id_current_state = 1 - оставить все
    для $id_current_state = 0 - оставить id_state = 1 и 3
    для $id_current_state = 2 - оставить id_state = 3

    Типа такого?

    PHP:
    1. <?php
    2. $results = array(
    3.     array("id_state" => 0, "name" => "Имя 0"),
    4.     array("id_state" => 1, "name" => "Имя 1"),
    5.     array("id_state" => 2, "name" => "Имя 2"),
    6.     array("id_state" => 3, "name" => "Имя 3")
    7. );
    8.  
    9.  
    10. function foo($arr, $id) {
    11.     foreach($arr as $mas) {
    12.         if (in_array($id, $mas)) {
    13.             if($id === 1) {
    14.                 echo '<pre>';
    15.                     print_r($arr);
    16.                 echo '</pre>';
    17.                 return;
    18.             }
    19.      
    20.             if($id === 0) {
    21.                 echo '<pre>';
    22.                     print_r($arr[1]);
    23.                 echo '</pre>';
    24.                 echo '<pre>';
    25.                     print_r($arr[3]);
    26.                 echo '</pre>';
    27.                 return;
    28.             }
    29.      
    30.             if($id === 2) {
    31.                 echo '<pre>';
    32.                     print_r($arr[3]);
    33.                 echo '</pre>';
    34.                 return;
    35.             }
    36.         }
    37.     }
    38. }
    39.  
    40. $id_current_state = 1;
    41. foo($results, $id_current_state);
    42. echo '---------------';
    43.  
    44. $id_current_state = 0;
    45. foo($results, $id_current_state);
    46. echo '---------------';
    47.  
    48. $id_current_state = 2;
    49. foo($results, $id_current_state);
     
  3. Огонек

    Огонек Новичок

    С нами с:
    21 июл 2017
    Сообщения:
    7
    Симпатии:
    1
    Спасибо за отклик
    Не так
    Если значения $id_current_state нет среди значений элементов id_curr_state ААА
    , то ничего с массивом не делать.
    А если значение $id_current_state (например 0) есть, то в массиве $results нужно оставить только те элементы, id_state которых находятся в значениях соответствующего ключа id_needed
    остальные удалить.
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Для начала я бы преобразовал Ваш второй массив к такому виду:
    Код (Text):
    1. $results_needed = [ 0 =>[ 1, 3], 2 => [3]];
    Вот таким способом:
    PHP:
    1. $arr2 = [];
    2. foreach ( $results_needed as $v)
    3. {
    4.     $arr2[ $v[ 'id_curr_state'] ][ ] = $v['id_needed'];
    5. }
    А потом удаление с проверкой:
    PHP:
    1. if ( isset ( $arr2[ $id_current_state ] ) )
    2. {
    3.     $arr1 = [];
    4.     foreach ( $results as $v )
    5.     {
    6.         if ( in_array($v['id_state'],  $arr2[ $id_current_state ] ) )
    7.         {
    8.             $arr1[] = $v;
    9.         }
    10.     }
    11. } else {
    12.     $arr1 = $results;
    13. }
     
  5. Огонек

    Огонек Новичок

    С нами с:
    21 июл 2017
    Сообщения:
    7
    Симпатии:
    1
    Со второй частью все понятно
    А вот с первой не совсем
    Мне кажется что
    массив станет
    PHP:
    1. $results_needed = [ 0 =>[1],0 =>[3], 2 => [3]];
    Или я ошибаюсь?
    Спасибо
     
  6. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Огонек, массив не может иметь два элемента с одним индексом.
     
    denis01 нравится это.