Php 在给定属性值的对象数组中查找数组键
我有这样一个对象数组:Php 在给定属性值的对象数组中查找数组键,php,arrays,object,Php,Arrays,Object,我有这样一个对象数组: Array ( [945] => member Object ( [id] => 13317 [name] => Test 999 [last_name] => Test 999 ) [54] => member Object ( [id] => 13316
Array
(
[945] => member Object
(
[id] => 13317
[name] => Test 999
[last_name] => Test 999
)
[54] => member Object
(
[id] => 13316
[name] => Manuel
[last_name] => Maria parra
)
[654] => member Object
(
[id] => 13315
[name] => Byron
[last_name] => Castillo
)
[656] => member Object
(
[id] => 13314
[name] => Cesar
[last_name] => Vasquez
)
)
我需要根据属性值删除其中一个对象。例如,我想从数组中删除对象id 13316。以下是功能方法:
foreach ($array as $key=>$value)
if ($value->id==13316) {
unset($array[$key]);
break;
}
$neededObjects = array_filter(
$objects,
function ($e) {
return $e->id != 13316;
}
);
由于已经给出了很多解决方案,我建议使用阵列的替代方案:
$storage = new SplObjectStorage; // create an Object Collection
$storage->attach($memberObject); // add an object to it
$storage->detach($memberObject); // remove that object
您可以使用Finder方法和其他实用程序操作将其创建为自定义的MemberCollection
类,例如
class MemberCollection implements IteratorAggregate
{
protected $_storage;
public function __construct()
{
$this->_storage = new SplObjectStorage;
}
public function getIterator()
{
return $this->_storage;
}
public function addMember(IMember $member)
{
$this->_storage->attach($member);
}
public function removeMember(IMember $member)
{
$this->_storage->detach($member);
}
public function removeBy($property, $value)
{
foreach ($this->_storage as $member) {
if($member->$property === $value) {
$this->_storage->detach($member);
}
}
}
}
不过,对于您的场景来说,这可能有点过头了 使用数组搜索功能:
//return array index of searched item
$key = array_search($search_value, array_column($list, 'column_name'));
$list[key]; //return array item
谢谢你的回答,我已经编辑了我的答案,我的键没有排序,我的意思是,它们不是0,1,2,3。。。请重新看看我的awnser,我更改了阵列键,thk!如果你用
array\u filter
重新定义你的函数,你会赢得我的支持票:D也许filter\u by\u key
会是一个更好的名字。@erisco,不管怎样,我按照你的建议将它改为filter\u by\u key
。我的直觉是,成员是一个值,所以filter_by_成员将返回所有满足基于其值的谓词的成员(只是一个常规过滤器)。另一个惯例是过滤函数通常只排除不满足谓词的内容。这就是为什么我希望看到使用array\u filter重写函数的原因,为什么不呢?因为array\u filter已经预先定义好了,可以执行您需要的操作?dude数组是第一个array\u filter参数,而不是最后一个!完美,值得注意的是,您可以定义类似函数($e)use($id_to_find){
的闭包,以便能够传递包含要搜索的id的变量。也许我是唯一一个不知道这一点的人;)awome..谢谢:D我使用它来比较数组元素arrayA是否存在于对象数组中。$arrayA=array(14,18,30,50);$neededObjects=array_filter($objects,function($e){返回_数组($e->id,$arrayA);});
//return array index of searched item
$key = array_search($search_value, array_column($list, 'column_name'));
$list[key]; //return array item