通过比较取消设置嵌套数组

时间:2015-11-03 14:58:32

标签: php arrays serialization multidimensional-array foreach

感谢您抽出宝贵时间来研究这个问题。

我有一个包含序列化数组(多个数组)的数据库条目。它可能看起来像这样:

数组1

a:2:{
  i:0;a:3:{s:11:"search_type";s:6:"owners";s:11:"search_text";s:4:"test";s:11:"search_name";s:4:"test";}
  i:1;a:5:{s:8:"t_rating";s:3:"Yes";s:9:"t_ranking";s:3:"Yes";s:11:"search_type";s:8:"products";s:11:"search_text";s:5:"test2";s:11:"search_name";s:5:"test2";}
}

然后,我传递了另一个可能如下所示的序列化数组:

数组2

a:2:{s:11:"search_type";s:6:"owners";s:11:"search_text";s:4:"test";}

条件

  • 数组1可以包含任意数量的嵌套数组(我的示例显示为2)。
  • 从选择器传递数组2;应该循环数组1并删除它相关的嵌套数组。
  • 使用PHP比较这些数组。

问题

问题是数组1中的每个数组都需要先删除" search_name"在进行比较之前的数组键。

" search_name"数组1中的键永远不应该用于比较。当" search_name"密钥被删除;然后可以对序列化数组进行有效比较。

但是,当它更新到db时;未删除的数组仍应包含" search_name"键。它只需要删除进行比较;那么它的完整数组应该从数组1中删除。

我的(破碎)代码

以下是我目前的情况:

$search_array = unserialize($_POST['search_array']);  // Serialized Array 2
$bm_adv_search = $query_adv_search[0]->bm_adv_search;  // Serialized Array 1

$unser_array = unserialize($bm_adv_search);  // Unserialize Array 1

// Unset search_name from each array in Array 1
foreach($unser_array as $key => $value) {

    unset($unser_array[$key]['search_name']);  // THIS IS THE PROBLEM AREA
}

// Unset Array 2 from Array 1
if(in_array($search_array, $unser_array)) {
    if(($key = array_search($search_array, $unser_array)) !== false) {
        unset($unser_array[$key]);
    }
}

// Re-Serialize Array 1
$reser_array = serialize($unser_array);

// Update db with Array 1
.....

所以当我将数组1更新到数据库时;名称字段已从所有嵌套数组中删除,更新时,排除" search_name"。

我需要" search_name"更新后保留阵列1中的每个数组。我只需要将其删除以进行比较......然后从数组1中删除嵌套数组。

想法

基本上,我正在存储用户保存的书签。当用户为项目添加书签时;序列化数组被添加到数组1.用户被提示输入"名称"用于搜索书签;因此" search_name"字段。

当用户点击删除书签时; " search_name" key在比较数组中不可用(数组2)。数组1应该为数组2的存在而循环(减去" search_name"键)...并且应该取消整个匹配的数组(包括" search_name")。 / p>

再次感谢您在这个问题上的任何时间。我真的很感激任何帮助。

更新

搞定了。谢谢Mikel !!

以下是更新后的代码:

$search_array = unserialize($_POST['search_array']);  // Serialized Array 2
$bm_adv_search = $query_adv_search[0]->bm_adv_search;  // Serialized Array 1

$unser_array = unserialize($bm_adv_search);  // Unserialize Array 1

// Clone Array 1
$compare_array = $unser_array; 

// Unset search_name from each array in cloned Array 1
foreach($compare_array as $key => $value) {

    unset($compare_array[$key]['search_name']); 
}

// Unset Array 2 from Array 1
if(in_array($search_array, $compare_array)) {
    if(($key = array_search($search_array, $compare_array)) !== false) {
        unset($unser_array[$key]);
    }
}

// Re-Serialize Array 1
$reser_array = serialize($unser_array);

// Update db with Array 1
.....

1 个答案:

答案 0 :(得分:0)

将“Array 1”复制到临时数组以进行比较,但对主$ unser_array进行任何真正的修改。

可以像$ compar_array = $ unser_array一样简单,然后在整个代码中修改一些变量。

然后您可以通过数组键比较两个,因为它们的键在数组中是相同的。 (你刚刚创建了这个副本)

Lemme知道您是否需要任何帮助!