PHP: Как удалить указанный c SubArray массива по нескольким значениям для совпадения? - PullRequest
1 голос
/ 30 апреля 2020

Допустим, у меня есть такой массив:

$cart = [
  [ 'productID' => '11111' , 'size' => 'M' , 'quantity' => 2 ],
  [ 'productID' => '11111' , 'size' => 'L' , 'quantity' => 4 ],
  [ 'productID' => '22222' , 'size' => 'S' , 'quantity' => 3 ],
  [ 'productID' => '22222' , 'size' => 'L' , 'quantity' => 7 ],
  [ 'productID' => '33333' , 'size' => 'M' , 'quantity' => 1 ]
];

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

removeElementFromArray( $cart , [ 'productID' => '11111' , 'size' => 'M' ] );

Но мой проблема в том, что я не понимаю логи c как этого добиться. Это то, что у меня есть

function removeElementFromArray($targetArray=[],$needles=[]){

  foreach( $targetArray as $subKey => $subArray ){

    // This is wrong because $removeIt becomes TRUE by any needle matched
    // but I want it to become TRUE only if all $needles match.
    foreach( $needles as $key => $value ){
      if( $subArray[$key] == $value ){
        $removeIt = TRUE;
      }
    }

    // delete row from array
    if( $removeIt == TRUE ){ unset($targetArray[$subKey]); }

  }

  // return
  return $targetArray;

}

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Ультра короткая array_filter версия с array_diff_assoc:

function removeElementFromArray($targetArray, $needles) {
    return array_filter($targetArray, function ($item) use ($needles) {
        return !empty(array_diff_assoc($needles, $item));
    });
}

Fiddle здесь .

1 голос
/ 30 апреля 2020

Простая модификация вашего кода может работать. Это начинается с предположения, что вы можете удалить элемент, затем, если какое-либо из значений не совпадает, то пометьте его как не соответствующий (и перестаньте смотреть) ...

function removeElementFromArray($targetArray=[],$needles=[]){

    foreach( $targetArray as $subKey => $subArray ){
        $removeIt = true;
        foreach( $needles as $key => $value ){
            if( $subArray[$key] !== $value ){
                $removeIt = false;
                break;
            }
        }

        // delete row from array
        if( $removeIt == TRUE ){ 
            unset($targetArray[$subKey]); 
        }

    }

    // return
    return $targetArray;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...