使用php中的id从多维数组中删除数组

时间:2017-11-16 06:07:50

标签: php arrays

我想使用ID的基础从多维数组中删除数组。我尝试使用foreach循环。但是,它没有用。

有人帮我解决了这个问题吗?

感谢。

=>数组:

Array
(
    [0] => Array
        (
            [id] => 11109
            [value] => Yes
            [field_id] => 234
        )

    [1] => Array
        (
            [id] => 11109
            [value] => Yes
            [field_id] => 237
        )

    [2] => Array
        (
            [id] => 11110
            [value] => No
            [field_id] => 234
        )

    [3] => Array
        (
            [id] => 11110
            [value] => No
            [field_id] => 237
        )

    [4] => Array
        (
            [id] => 11111
            [value] => No
            [field_id] => 237
        )

)

从这个数组中,我想删除

的数组
  • field_id是234,值是"否" &安培;&安培; field_id是237,值是 "否"
  • field_id是234,值是"是" &安培;&安培; field_id是237,值是
    "是"

因此,从此数组中只显示ID 11111数组,否则将从当前数组中删除所有数组。

这是我的代码使用我试图删除数组。

foreach ($collection->getData() as $key => $value) {
                        if(($value['field_id'] == $ids[0] && $value['value'] == "No")){
                            echo $value['id'];
                            // exit;
                            break;
                        }
                        echo $value['field_id'];
                        echo $value['value'];
                        if(($value['field_id'] == $ids[1] && $value['value'] == "No")){
                            print_r($collection->getData()[$key]);
                            unset($collection->getData()[$key]);
                            unset($collection->getData()[$key-1]);
                        }
                    }

4 个答案:

答案 0 :(得分:0)

函数getData()是否返回数组或引用的副本?如果只是副本,则unset($collection->getData()[$key])将无效。

最好像你一样循环遍历数组,但将要删除的所有键存储在另一个数组中(例如$keysToRemove)。当for-each-loop完成后,你开始循环包含你要删除的所有键的新数组$keysToRemove,然后从数组中删除。

$keysToRemove = array();
$data = $collection->getData(); // copy or reference?
foreach ($data as $key => $value) {
  if(($value['field_id'] == $ids[0] && $value['value'] == "No")){
    echo $value['id'].'<br>';
    break; // exit the loop? If you want to jump to the next element use "continue"
  }
  echo $value['field_id'].'<br>';
  echo $value['value'].'<br>';
  if(($value['field_id'] == $ids[1] && $value['value'] == "No")){
    $keysToRemove[$key]   = true;
    $keysToRemove[$key-1] = true;
  }
}

foreach(array_keys($keysToRemove) as $key){
  echo '<p>remove key '.$key.' with content <pre>'.print_r($data[$key], true).'</pre></p>';
  unset($data[$key]);
}

echo '<p>Result array is<pre>'.print_r($data, true).'</pre></p>';

所以你不要操纵你的循环使用的数组。

答案 1 :(得分:0)

您可以创建一个新的多维数组,并只复制您想要的值。

另外,当你使用break时,你完全退出foreach循环,我不认为这是预期的行为,使用继续跳过当前迭代并测试下一个元素

答案 2 :(得分:0)

基于提及其Magento Collection的评论。我想,你可以过滤集合中的id,这样就不会将它们作为你想要的集合的一部分。像:

$collection = Mage::getModel('your/model')->getCollection();
$collection->addAttributeToFilter('field_id', array('nin' => array(234, 237)));

或者,如果您的模型是非eav实体模型,则跟随

$collection = Mage::getModel('your/model')->getCollection();
$collection->addFieldToFilter('field_id', array('nin' => array(234, 237)));

答案 3 :(得分:0)

尝试使用此代码删除所有值为No

的数组值
$cart = array(
    0 => array
    (
        'id' => 11109,
        'value' => 'Yes',
        'field_id' => 234
    ),
    1 => array
    (
        'id' => 11109,
        'value' => 'Yes',
        'field_id' => 123
    ),
    2 => array
    (
        'id' => 11110,
        'value' => 'No',
        'field_id' => 234
    ),
    3 => array
    (
        'id' => 11110,
        'value' => 'No',
        'field_id' => 237
    ),
    4 => array
    (
        'id' => 11111,
        'value' => 'No',
        'field_id' => 237
    ),
);




$found = array();
$i = 0;
foreach ($cart as $key => $data) {
    if ($data['field_id'] == 234 && $data['value'] == 'No') {


        $found[$i]['id'] = $data['id'];
        $found[$i]['value'] = $data['value'];
        $found[$i]['field_id'] = $data['field_id'];
        $i++;

    }
}

echo "<pre>";
print_r($found);

然后输出是:

  Array
(
    [0] => Array
        (
            [id] => 11111
            [value] => No
            [field_id] => 234
        )

)