Поиск в многомерном массиве, какие ключи содержат определенное значение и удалить ключи, которые не - PullRequest
1 голос
/ 28 июня 2019

У меня есть многомерный массив, который содержит ключевые слова (электронная почта, корзина и т. Д.), А каждое ключевое слово имеет определенный список приложений (EmailAppA ..) с их рейтингом (1,2 ..).

Array
(
    [email] => Array
        (
            [EmailAppA] => 1
            [EmailAppB] => 2
            [EmailAppC] => 4
        )

    [cart] => Array
        (
            [CartAppA] => 1
            [CartAppB] => 2
            [MyApp] => 4
        )
    [reviews] => Array
        (
            [reviewAppA] => 1
            [reviewAppB] => 4
            [reviewAppC] => 5
            [MyApp] => 7

        )

Чего я хочу добиться, так это зацикливаться в массиве, находить все ключи, которые содержат приложение «MyApp», и в конечном итоге удалять ключи, которые не содержат значение «MyApp». Массив должен оставаться только с корзиной и отзывами и их значениями, электронная почта была удалена.

Мой код пока что, но я застрял:

foreach ($mappedStuff as $keywords=>$value){
    foreach ($value as $apps=>$rank){
        if($apps != 'MyApp'){
          unset($mappedStuff[$keywords];
        }
    }
}

Ответы [ 5 ]

1 голос
/ 28 июня 2019

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

array_walk($a, function($v, $k) use (&$a){
  if(!array_key_exists('MyApp', $v)) unset($a[$k]);
});

https://3v4l.org/gtEIt

1 голос
/ 28 июня 2019

Вы должны изменить foreach()

foreach ($mappedStuff as $key=>$value){

    if(!in_array('MyApp', array_keys($value))){

      unset($mappedStuff[$key]);

   }

}

Выход: - https://3v4l.org/Z64Um

1 голос
/ 28 июня 2019

Вы можете отфильтровать массив, используя array_filter . Внутри его функции обратного вызова вы будете искать существование MyApp. Если он не существует, функция обратного вызова вернет false и текущий ключ будет отфильтрован.

$filtered = array_filter($array, function($apps)
{
   return in_array('MyApp', $apps);
});

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

$filtered = array_filter($array, function($apps)
{
   return isset($apps['MyApp']);
});
0 голосов
/ 28 июня 2019

Простая вещь, которую вы можете сделать, это использовать цикл for внутри foreach для достижения ваших внутренних значений и использовать функцию unset. Например:

//This is your array
foreach($yourArray as $item)
{
    //These are your categories
    for( $i = 0; $i < count($item); $i++ )
    {
        //for every value of your category's keys, check if they don't match 'MyApp'
        if($item[$i] !== "MyApp")
        {
            //If above statement is true, unset them
            unset($item[$i]);
        }
    }
}

Попробуй и скажи нам:)

0 голосов
/ 28 июня 2019

Используйте unset ($ mappedStuff [$ key] [$ apps]) , чтобы удалить значение,


foreach ($mappedStuff as $key => $value) {
    foreach ($value as $apps => $rank) {
        if($apps == 'MyApp') {
            unset($mappedStuff[$key][$apps]);
        }
    }
}
...