12

これが私の配列のprint_r出力です:

Array
(
[0] => stdClass Object
    (
        [itemId] => 560639000019
        [name] => Item no1
        [code] => 00001
        [qty] => 5
        [id] => 2
    )

[1] => stdClass Object
    (
        [itemId] => 470639763471
        [name] => Second item
        [code] => 76347
        [qty] => 9
        [id] => 4
    )

[2] => stdClass Object
    (
        [itemId] => 56939399632
        [name] => Item no 3
        [code] => 39963
        [qty] => 6
        [id] => 7
    )

)

配列からオブジェクトを削除するために、[id] => 4のオブジェクトのインデックスを見つけるにはどうすればよいですか?

4

11 に答える 11

13
$found = false;  
foreach($values as $key => $value) {
    if ($value->id == 4) {
        $found = true;
        break;
    }
}

if ($found) unset($values[$key]);

array削除するオブジェクトが見つかるまでtoを繰り返すだけなので、これは他のどのソリューションよりも高速であると見なされます。

注:反復中に配列の要素を削除しないでください。後でここで削除します。

于 2012-07-17T19:20:56.460 に答える
8
foreach($parentObj AS $key=>$element){
  if ($element->id == THE_ID_YOU_ARE_LOOKING_FOR){
    echo "Gottcha! The index is - ". $key;
  }
}

$parentObj明らかにあなたのルート配列です-他のすべてを保持するものです。

foreachループを使用して各アイテムを反復処理し、そのidプロパティを必要な値に対してテストします。それができたら、私たちが取り組んでいる$keyのはあなたが探しているインデックスです。

于 2012-07-17T19:16:25.377 に答える
3

array_searchを使用します:

$a = new stdClass;
$b = new stdClass;
$a->id = 1;
$b->id = 2;

$arr = array($a, $b);
$index = array_search($b, $arr);

echo $index;
// prints out 1
于 2012-07-17T19:26:16.853 に答える
1

これを試して

foreach($array AS $key=>$object){
   if($object['id'] == 4){
       $key_in_array = $key;
   }
}

// chop it from the original array
array_slice($array, $key_in_array, 1);
于 2012-07-17T19:22:57.113 に答える
0

面白い選択肢

$getIdUnset = function($id) use ($myArray)
{
    foreach($myArray as $key => $obj) {
        if ($obj->id == $id) {
            return $key;
        }
    }

    return false;
};

if ($unset = $getIdUnset(4)) {
    unset($myArray[$unset]);
}
于 2012-07-17T19:47:20.757 に答える
0

結果を得る別の方法は、array_filterを使用することです。

$array = array(
    (object)array('id' => 5),
    (object)array('id' => 4),
    (object)array('id' => 3)
);
$array = array_filter($array, function($item) {
    return $item->id != 4;
});
print_r($array);
于 2012-07-17T19:24:50.250 に答える
0

これが私の解決策です。与えられて、それは少しハックですが、それは仕事を成し遂げるでしょう。

search(array $ items、mixed $ id [、&$ key]);

で見つかったアイテムを返します$id。変数を追加する$keyと、見つかったアイテムのキーが表示されます。

function search($items, $id, &$key = null) {
  foreach( $items as $item ) {
    if( $item->id == $id ) {
      $key = key($item);
      return $item;
      break;
    }
  }

  return null;
}

使用法

$item = search($items, 4, $key);
unset($items[$key]);

注:これを変更して、カスタムキーを許可し、同じ値を共有する複数のアイテムを返すことができます。

例を作成したので、実際の動作を確認できます

于 2012-07-17T19:36:44.737 に答える
0

現在、phpにはまだこれをサポートする機能がありません。

したがって、JavaのVectorまたはjQueryの$ .inArray()を参照すると、次のようになります。

public function indexOf($object, array $elementData) {
    $elementCount = count($elementData);
    for ($i = 0 ; $i < $elementCount ; $i++){
        if ($object == $elementData[$i]) {
            return $i;   
        }
    }
    return -1;
}

この機能は、後で使用するためにコア機能として保存できます。

于 2015-11-05T04:38:06.117 に答える
0

私の場合、これ$array
は私のプロジェクトのこの問題について混乱していたので私の配列ですが、ここでのいくつかの答えは私を助けました。

array(3) { 
           [0]=> float(-0.12459619130796) 
           [1]=> float(-0.64018439966448) 
           [2]=> float(0)
         }

次にif condition、ループを停止するために使用します

foreach($array as $key => $val){
           if($key == 0){ //the key is 0
               echo $key; //find the key
               echo $val; //get the value
           }
        }
于 2020-08-02T14:03:17.710 に答える
0

何年も経った後、これは役に立たない答えになるかもしれませんが、なぜですか?

これは、index_of他の回答と同じコードを使用して可能なものの私の個人的な実装ですが、プログラマーにチェックをいつどのように行うかを選択させ、複雑なチェックもサポートします。

if (!function_exists('index_of'))
{
    /**
     * @param iterable $haystack
     * @param callable $callback
     * @param mixed|null &$item
     * @return false|int|string
     */
    function index_of($haystack, $callback, &$item = null)
    {
        foreach($haystack as $_key => $_item) {
            if ($callback($_item, $_key) === true) {
                $item = $_item;
                return $_key;
            }
        }
        return false;
    }
}
于 2021-06-17T08:21:23.403 に答える
-1
foreach( $arr as $k=>&$a) {
    if( $a['id'] == 4 )
        unset($arr[$k]);
}
于 2012-07-17T19:23:52.120 に答える