0

私はこれをやっていた:

 $attributes = array("a", "b", "c", "d","e","f", "g","h" ,"i","j","k","l");
    foreach($all as $p) {
     foreach($attributes as $key => $a) {
      if (!$p->getAttribute($a)) {
        unset($attributes[$key]);
      }
     }
    }

しかし、unset$attributesはループ内の配列を縮小し、必要な値をunsetしているようです。

編集:これは何が起こるかではありません。本当の問題は、これらはネストされたループであるため、falseを返す場合、最初のループがtrueを返す属性を$ pに提供する可能性があるため!$p->getAttribute($a)、配列で設定を解除してはいけないということです。foreach($all as $p)

!$p->getAttribute($a)$attributesからそれぞれの$aを削除したい場合は、これが必要です。それを行うための最も効率的な方法は何ですか?

4

2 に答える 2

0

何度も実行する必要がある場合は、$pクラスのメソッドから$pから属性配列を返し、使用することをお勧めします。

array_diff($attributes, $p->getAttributes());
于 2012-12-06T23:11:12.000 に答える
0

これは私が最終的にしたことです:

$all_attributes = array("a", "b", "c", "d","e","f", "g","h" ,"i","j","k","l");
$attributes = array();
foreach($allpkg as $p) {
  foreach($all_attributes as $key=> $a) {
    if ($p->getAttribute($a) && (!in_array($a, $attributes))) {
      array_push($attributes,$a);
    }                           
  }
}

編集:質問自体の編集のためにソリューションが編集されました...(aaawww、混乱してすみません)。たぶん、最もエレガントではなく、確かに最も効率的ではありません(必要なすべての要素をコピーしています...)。しかし、私は何が起こっているのかを明確に制御でき、それは機能します:)

于 2012-12-07T15:24:44.810 に答える