array_search函数没有返回值

3
这里有两个表,分别是工具和工具使用。
工具表长这样:
  id   name               tools_names                                   quantity    type

  13  cutting player  cutting playerA,cutting playerB,cutting playerC     3       engineer
  12  REFLECTORS      REFLECTORSA,REFLECTORSB                             2         team

工具使用表格如下:

 id     user_id   type        tools                 
 8      siraj    engineer   cutting playerA,cutting playerB     
 7      siraj    team       REFLECTORSB         
 6      siraj    team       REFLECTORSA     

我想在插入时显示除插入到tool_use表中的tools_names之外的所有工具名称,但是即使结果看起来像表格中一样,整个tools_names也会显示。这是我的控制代码。
public function ajax_tools()
{
    $data['tools']=$this->Tools_model->view_available_tools($_POST['type']);
    foreach ($data['tools'] as $key=>$val) {
    $data['toolss'][] =explode(',',$val['tools_names']);

       }
    $data['tools_names'] = $this->Tools_model->get_tool_names($_POST['type'])->result();
   foreach ($data['tools_names'] as $row) 
    {
        if (($key =array_search($row->tools,$data['toolss'])) !== false) 
        {
            unset($data['toolss'][$key]);
            $data['toolss'] = array_values($data['toolss']);

        }
    }
    return $data['toolss'];
    $this->load->view('ajax_tools',$data);
}

这是我的模型

public function view_available_tools($type)
{
    $this->db->order_by('id','desc');
    $this->db->where('status',1);
    $this->db->where('type',$type);
    $query=$this->db->get('tools');
    return $query->result_array(); 
}

public function get_tool_names($type)
{
    return $this->db->get_where('tool_use',array('type'=>$type));
}

这是我的视图

<div class="form-group">
        <label for="type" class="control-label">Type:</label>
        <select name="type" id="type" class="form-control" required>
        <option value="">please select</option>
        <option value="team" <?php echo set_select('type','team'); ?>>Team</option>
        <option value="engineer" <?php echo set_select('type','engineer'); ?>>Engineer</option>
        </select>
      </div>

      <div class="form-group ">
        <label for="tools" class="control-label">Tools:</label>
        <select name="tools[]" id="tools"  multiple="multiple" required>
        <option value="">please select</option>

        </select>
      </div>

<script>
$('#type').change(function(){
var type=$('#type').val();
var url='<?php echo base_url(); ?>tools/tools_control/ajax_tools';
      $.post(url, {type:type}, function(data)
      {  

        $('#tools').html(data); 
      });
 });
</script>

请帮我解决我的问题


应该是"return $data['tools']"而不是"return $data['toolss']",对吗? - deChristo
不要使用额外的字母来表示其他变量(tools vs. toolss)-> 始终使用自我解释的名称(loadedTools vs. toolNames)- CleanCode - Wax Cage
它变成了一个问题 - user_777
https://dev59.com/gHA65IYBdhLWcg3wvxaE#3653574 - e4c5
有人有什么想法吗? - user_777
2个回答

1
当你使用array_search时,你正在尝试搜索$row->tools,它应该包含cutting playerA,cutting playerB。而你在一个不包含相同类型逗号分隔值列表的数组中进行搜索,而是包含它们的分解版本(正如你在第3行执行的explode)。

那么其他两个值REFLECTORSBREFLECTORSA呢?它们只包含一个值,所以应该显示出来,对吧? - user_777
实际上不是这样的:只考虑类型为“team”的情况,$data['toolss']将是[0 => ['REFA', 'REFB']],而在第一次循环迭代中$row->tools将是'REFB'(然后在第二次迭代中是'REFA')。因此,您的代码执行了array_search('REFB', [0 => ['REFA', 'REFB']]),这不能返回任何索引。 - Stock Overflaw
现在它正在返回...看到我的回答,但仅适用于插入单个值的行,而不适用于存储为数组的行。 - user_777

0
如果表格 tool_use 中的 tools 包含单个值,我可以找出解决方案。但如果它包含多个值,也就是存储为数组,则使我远离目标。请看一下。
public function ajax_tools()
{
    $data['tools']=$this->Tools_model->view_available_tools($_POST['type']);
    foreach ($data['tools'] as $key=>$val)
     {
    $data['toolss'][] = $data['t']=explode(',',$val['tools_names']);
     }
    $data['tools_names'] = $this->Tools_model->get_tool_names($_POST['type'])->result();
    var_dump($data['tools_names']);
    foreach ($data['tools_names'] as $val) 
    {
        if (($key =array_search($val->tools,$data['t'])) !== false) 
        {
            unset($data['t'][$key]);
            $data['t'] = array_values($data['t']);

        }
    }

    $this->load->view('ajax_tools',$data);
}

有人有任何想法吗? - user_777

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接