【问题标题】:if value in multidimentional array unset whole contained array如果多维数组中的值未设置整个包含的数组
【发布时间】:2013-02-18 11:00:24
【问题描述】:

我有一个将项目添加到数据库的脚本。

目前我有一个这样创建的数组:

foreach(blah as $album){

$add[] = array('album' => $album['name'],
               'test' => $album['test']
            );

} // end foreach

专辑名称并不总是唯一的,$album['test'] 可以是随机文本(稍后使用)或“FALSE”(当我说 false 时,我的意思是单词 false,用文本字母拼写)

我需要一个函数来以某种方式搜索数组,并比较名称和测试值...每个专辑名称可能有几个条目,有几个不同的随机文本值,一个说 FALSE。如果有一个数组条目的测试值设置为 FALSE,那么它将删除所有其他包含的具有相同专辑名称的数组...

这样:

array(array('album' => 'album_name1', 'test' => 'xqus8n4n'),
      array('album' => 'album_name1', 'test' => 'FALSE'),
      array('album' => 'album_name1', 'test' => 'jdh4dhdk'),
      array('album' => 'album_name2', 'test' => 'hdis8ebk'),
      array('album' => 'album_name2', 'test' => 'hisb8bs7'),
      array('album' => 'album_name2', 'test' => 'FALSE'),
      array('album' => 'album_name3', 'test' => 'yek98abk'),
      array('album' => 'album_name3', 'test' => '8iksh2q7')
     );

变成这样:

array(array('album' => 'album_name1', 'test' => 'FALSE'),
      array('album' => 'album_name2', 'test' => 'FALSE'),
      array('album' => 'album_name3', 'test' => 'yek98abk'),
      array('album' => 'album_name3', 'test' => '8iksh2q7')
     );

我希望这是有道理的,因为除非你知道我的整个脚本结构,否则它看起来有点令人困惑,这就是我提供这么多信息的原因。

【问题讨论】:

    标签: php search multidimensional-array unset array-multisort


    【解决方案1】:
    $multiarray = array(
          array('album' => 'album_name1', 'test' => 'xqus8n4n'),
          array('album' => 'album_name1', 'test' => 'FALSE'),
          array('album' => 'album_name1', 'test' => 'jdh4dhdk'),
          array('album' => 'album_name2', 'test' => 'hdis8ebk'),
          array('album' => 'album_name2', 'test' => 'hisb8bs7'),
          array('album' => 'album_name2', 'test' => 'FALSE'),
          array('album' => 'album_name3', 'test' => 'yek98abk'),
          array('album' => 'album_name3', 'test' => '8iksh2q7')
         );
    
    $keysToRemove = array( );
    
    // Go and find all the FALSE values and which albums they belong to
    foreach ( $multiarray as $album ) {
      if ( in_array( 'FALSE', $album ) ) {
        $keysToRemove[] = $album['album'];
      }
    }
    
    // Remove all instances of the albums that had FALSE values
    // except the ones that had the word FALSE (we keep those :p )
    for( $i = 0; $i < count($multiarray); $i++ ) {
        if ( ( in_array( $multiarray[$i]['album'], $keysToRemove ) ) && ( $multiarray[$i]['test'] != 'FALSE' ) ){
            unset( $multiarray[$i] );
        }
    }
    
    // reset keys so that they are numerical again.
    $multiarray = array_values(array_filter($multiarray)); 
    
    print_r( $multiarray );
    

    给出以下结果:

    Array ( 
      [0] => Array ( [album] => album_name1 [test] => FALSE ) 
      [1] => Array ( [album] => album_name2 [test] => FALSE ) 
      [2] => Array ( [album] => album_name3 [test] => yek98abk ) 
      [3] => Array ( [album] => album_name3 [test] => 8iksh2q7 ) 
    ) 
    

    【讨论】:

    • 这看起来很有希望...但我不想删除没有错误值的专辑,如果该数组存在错误值...对不起:)
    • 好吧,试试我上面更新的代码,似乎给你想要的结果
    【解决方案2】:

    使用php函数array_key_exists()

    foreach($album as $alb){
    
     if (array_key_exists('FALSE', $alb)) {
    
      // Remove other array keys or save into new array
     }
    
    } // end foreach
    

    【讨论】:

    • 我尝试了回显 $alb 的代码,您将保存到新数组的位置...并且根本没有输出...正在搜索数组键是否称为“FALSE”,我需要搜索值,如果“测试”值之一为“假”,则未设置具有相同专辑名称的所有其他数组。非常感谢
    • 是的,对不起, in_array("FALSE",$alb) 可以解决问题。然后保存到数组中,以便稍后删除其他节点。
    【解决方案3】:

    这给出了你想要的输出

      function array_searches($item,$key,$keys,$value){
        if($key[$keys]==$value){
        return true;
        }
        return false;
        }
        $array= array(
              array('album' => 'album_name1', 'test' => 'xqus8n4n'),
              array('album' => 'album_name1', 'test' => 'FALSE'),
              array('album' => 'album_name1', 'test' => 'jdh4dhdk'),
              array('album' => 'album_name2', 'test' => 'hdis8ebk'),
              array('album' => 'album_name2', 'test' => 'hisb8bs7'),
              array('album' => 'album_name2', 'test' => 'FALSE'),
              array('album' => 'album_name3', 'test' => 'FALdsfSE'),
            array('album' => 'album_name3', 'test' => 'FALsdfSE'),
        );
    
        $i=0;
    
    
    function custom_op($array){
    $new_array=array();
    foreach ($array as $key=>$value){
    if(array_custom_search($key,$value,'test','FALSE')){
    $new_array[]=$value;
    foreach($array as $key1=>$value1){
    if(array_search($key1,$value1,'album',$value['album'])){
    unset($array[$key1]);//unset the array value where 'test' is false 
    }
    }
    }
    }
    
    
    foreach ($new_array as $key=> $value){
    $array[]=$value;
    }
    echo "<pre>asdf";
    print_r($array);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-25
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2019-10-30
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多